0

私がやろうとしていることの例は、おそらく最高です:

def repeater(n = 1)
  n.times { yield }
end

デフォルトでは、リピーターは指定されたブロックを 1 回通過します。ただし、n > 1 の場合はブロックを複数回通過させたいと考えています。何らかの理由で上記のコードが機能しません。

例えば:

これは になると思い64ますが、代わりに を返します5:

y = 2
repeater(5) { y *= 2 }

なぜこうなった?どこが間違っていますか?私は にかなり慣れてyieldいないので、完全には (はっきりと) 理解していません。

4

3 に答える 3

1

問題は、 の戻り値repeaterが の戻り値でありtimes、常に であるということです。そのため、代わりにそれ自体nの結果の値を調べる必要があります。y

y = 2
repeater(5) { y *= 2 }  #=> 5
y  #=> 64

repeater実際に最終結果を返したい場合は、 Rangereduceを超えることができます:

def repeater(n = 1)
  (0..n).reduce { yield }
end

y = 2
repeater(5) { y *= 2 }  #=> 64
于 2013-06-11T04:47:54.417 に答える
0

に問題はありませんyield。この関数は、n.times { … }明らかに equalsである結果を返し5ます。

> 5.times { }
# => 5

yield の結果を累積し、関数から明示的に返したいとします。

于 2013-06-11T04:47:38.283 に答える