-1

多くの場合、ループ内でいくつかの操作を実行し、反復の間に他の操作を実行する必要があります。簡単な例は、単語を配列から文字列に収集し、逆向きに綴り、コンマで区切ることです。これに対するイディオムまたは言語サポートはどの言語でもありますか? (今のところ、私は主に Ruby に興味があります。)

私は通常、次のようなことをします

a = ['foo', 'bar', 'baz']
s = ''
n = a.size - 1
i = 0
loop do
  s << a[i].reverse
  break if i == n
  s << ', '
  i += 1
end

しかし、Ruby イテレーターを使用する場合、この半分のイテレーションを保存する良い方法がわかりません。

これは冗長に見えます:

a = ['foo', 'bar', 'baz']
s = ''
a.each do |w|
  s << w.reverse
  s << ', ' unless w == a.last
end

更新 1.より実用的な例は、HTML のブロックがループで作成され、HTML の他のブロックと連結する必要がある Haml テンプレートの作成です。


更新 2。programmers.stackexchangeで、私の問題は「ループと半分」の問題と呼ばれることが示唆されました


更新 3.end Haml では(インデントを使用するだけで) でブロックを閉じることができないため、Haml で Map-Reduce パターンを適用できませんでしmapreduce。したがって、ある意味では、この質問はまだ未解決ですが、これを行う方法がないため、クローズされている可能性もあります。だから、これはおかしな質問だと思います。

4

5 に答える 5

4

標準的な Ruby の方法は次のとおりです。

a.map(&:reverse).join(", ")
于 2013-02-26T20:59:33.693 に答える
2

配列内の各要素の処理と、結果の配列を何らかの方法で変換するその他の処理を区別しました。これらは MapReduce モデルの「map」と「reduce」です。

http://en.wikipedia.org/wiki/Mapreduce

于 2013-02-26T21:45:24.250 に答える
0
a = ['foo', 'bar', 'baz'] 
a.each do |w|
    w.reverse!
end
s = a.join(',')

これはあなたが探していたものですか?出力は次のとおりです。

oof,rab,zab

于 2013-02-26T21:00:56.837 に答える
0

このような操作を頻繁に実行する必要がある場合は、次のように簡単に拡張できますArray

class Array
  def join_cb
    inject ('') { |v, e| 
      v += "#{e}#{yield e unless e == self.last}"
    }
  end
end

そして、次のように使用します:

> a = ['foo', 'bar', 'baz']
> a.map(&:reverse).join_cb { '%' }
# ⇒ "oof%rab%zab"

または、配列要素に依存する連結文字列を作成するには:

> a.map(&:reverse).join_cb { |e| e == 'rab' ? '-' : '_' }
# ⇒ "oof_rab-zab"
于 2013-02-26T22:26:44.233 に答える
0

Hamlでも機能する解決策として、次のようにすることが提案されました。

a.each_with_index do |item, index|
  unless index.zero?
    # do what is to be done between the iterations
  end
  # do what is to be done on all iterations
end

私は今それを使用していますが、もちろん最適ではありません。条件は反復ごとに実行されます。マイナーな不便として、前のアイテムは「反復の間」にアクセスできません。

于 2013-03-02T12:22:09.430 に答える