0

我正在尝试做的一个例子可能是最好的:

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

默认情况下,repeater 将通过一次给定的块。但是,如果给定 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实际返回最终结果,您可以reduce通过Range

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 { … }显然等于的结果5

> 5.times { }
# => 5

您想累积 yield 的结果并从您的函数中显式返回它。

于 2013-06-11T04:47:38.283 回答
0

我设法使用times我尝试做的方法解决了这个问题:

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

如我所愿,上面看起来不错,但我希望我可以用n.times而不是(n - 1).times.

以下是使用它的解决方案,但它看起来并不优雅:

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

我会尝试找到一个更优雅的解决方案。

于 2013-06-11T05:10:21.550 回答