ruby – 麻烦在块/ lambda内产生

前端之家收集整理的这篇文章主要介绍了ruby – 麻烦在块/ lambda内产生前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下 Ruby代码
  1. # func1 generates a sequence of items derived from x
  2. # func2 does something with the items generated by func1
  3. def test(x,func1,func2)
  4. func1.call(x) do | y |
  5. func2.call(y)
  6. end
  7. end
  8.  
  9. func1 = lambda do | x |
  10. for i in 1 .. 5
  11. yield x * i
  12. end
  13. end
  14.  
  15. func2 = lambda do | y |
  16. puts y
  17. end
  18.  
  19.  
  20. test(2,func2) # Should print '2','4','6','8',and '10'

当然,这不起作用.

  1. test.rb:11: no block given (LocalJumpError)
  2. from test.rb:10:in `each'
  3. from test.rb:10
  4. from test.rb:4:in `call'
  5. from test.rb:4:in `test'
  6. from test.rb:20

解决方法

Lambdas不会像常规方法那样隐式接受块,所以你的func1不能产生.改为:
  1. func1 = lambda do |x,&blk|
  2. for i in 1 .. 5
  3. blk.call(x * i)
  4. end
  5. end

具体来说,我认为这是因为yield会将控制权发送回调用者的块,这不包括lambda调用.所以下面的代码就像你“期待”一样:

  1. def foo
  2. (lambda { |n| yield(n) }).call(5)
  3. end
  4. foo { |f| puts f } # prints 5

猜你在找的Ruby相关文章