おはよう。列挙子のループマジック(ブレイクがなく、無限ループは同時に起こらない)
短い質問How do loop inside a Enumerator.new knows where to stop?
。
ここでさらに説明的な例です。ここでは、両方とも同じ配列を返しますコードのスニペットです:[1,2,4,8]
。しかし、最初の例ではbreak
にはloop
という状態があり、何とか2番目の例が止まったら。
enum = Enumerator.new do |x|
x << "hello"
x << "world"
end
enum.take(1)
#=> ["hello"]
enum.take(100)
#=> ["hello", "world"]
:break
def simple n
x = []
a = 1
i = 0
loop do
x << a
a *= 2
i += 1
break unless i < n # in this case condition for stop used
end
x
end
p simple(4)== [1,2,4,8]
と
例1
def enumer
Enumerator.new do |x|
a = 1
loop do # How do this loop know where to stop?
x << a
a *= 2
end
end
end
p enumer.take(4) == [1,2,4,8]
例#2 "魔法" は
ありがとう、それは超有益であり、ありがとうございます。 –