AJM*_*AJM 8 ruby lambda yield block
我有以下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'
Run Code Online (Sandbox Code Playgroud)
当然,这不起作用.
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
Run Code Online (Sandbox Code Playgroud)
wup*_*tah 12
Lambdas不会像常规方法那样隐式接受块,所以你func1不能屈服.改为:
func1 = lambda do |x, &blk|
for i in 1 .. 5
blk.call(x * i)
end
end
Run Code Online (Sandbox Code Playgroud)
具体来说,我认为这是因为yield会将控制权发送回caller块,而不包括lambda调用.所以下面的代码就像你"期待"一样:
def foo
(lambda { |n| yield(n) }).call(5)
end
foo { |f| puts f } # prints 5
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3042 次 |
| 最近记录: |