我有以下 Ruby 代码:
# func1 generates a sequence of items derived from x
# func2 does something with the items generated by func1
def test(x, func1, func2)
func1.call(x) do | y |
func2.call(y)
end
end
func1 = lambda do | x |
for i in 1 .. 5
yield x * i
end
end
func2 = lambda do | y |
puts y
end
test(2, func1, func2) # Should print '2', '4', '6', '8', and '10'
这当然行不通。
test.rb:11: no block given (LocalJumpError)
from test.rb:10:in `each'
from test.rb:10
from test.rb:4:in `call'
from test.rb:4:in `test'
from test.rb:20
最佳答案
Lambda 不会像常规方法那样隐式接受 block ,因此您的 func1
无法让步。改为这样做:
func1 = lambda do |x, &blk|
for i in 1 .. 5
blk.call(x * i)
end
end
具体来说,我认为这是因为 yield 会将控制权发送回 caller
的 block ,这将不包括 lambda 调用。所以下面的代码就像你“期望”的那样工作:
def foo
(lambda { |n| yield(n) }).call(5)
end
foo { |f| puts f } # prints 5
关于ruby - 在 block /lambda 中产生问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4982630/