私は Ruby を初めて使用しyield
ます。Ruby 関数から値を取得する方法はありますか? はいの場合、どのように?そうでない場合、遅延コードを作成するためのオプションは何ですか?
16469 次
5 に答える
59
Ruby のyield
キーワードは、同じ名前の Python キーワードとはまったく異なるものなので、混同しないでください。Ruby のyield
キーワードは、メソッドに関連付けられたブロックを呼び出すための構文糖衣です。
最も近いものは、Ruby の Enumerator クラスです。たとえば、Python に相当するもの:
def eternal_sequence():
i = 0
while True:
yield i
i += 1
これは:
def eternal_sequence
Enumerator.new do |enum|
i = 0
while true
enum.yield i # <- Notice that this is the yield method of the enumerator, not the yield keyword
i +=1
end
end
end
を使用して、既存の列挙メソッドの列挙子を作成することもできますenum_for
。たとえば('a'..'z').enum_for(:each_with_index)
、小文字の列挙子とアルファベット内の位置を示します。each_with_index
これは、1.9 のような標準の Enumerable メソッドを使用して無料で取得できるため、記述('a'..'z').each_with_index
するだけで列挙子を取得できます。
于 2010-03-24T00:55:40.770 に答える
15
遅延して値を生成しようとしている場合は、@Chuck の答えが正しいものです。
コレクションを遅延反復処理する場合は、Ruby 2.0 で新しい.lazy
列挙子が導入されました。
range = 1..Float::INFINITY
puts range.map { |x| x+1 }.first(10) # infinite loop
puts range.lazy.map { |x| x+1 }.first(10) # [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
于 2015-05-16T16:18:16.397 に答える