ruby - 在 block /lambda 中产生问题

标签 ruby lambda block yield

我有以下 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/

相关文章:

ruby - 为 Mongo DB 存储格式化 JSON 日期的最佳方法是什么

ruby - 将实例变量设置为 'self' ?

c# - 编写 LINQ 或 Lambda 以检索具有匹配供应商 ID 的项目的正确方法

ios - EXC_BAD_ACCESS objective-c block

mysql - 我可以在触发器(mySQL)中使用嵌套的 BEGIN/END block 吗

apache-spark - 如何使用 Spark 写入 128 MB parquet 文件

计算斐波那契数时的 Ruby "FloatDomainError: Infinity"

ruby-on-rails - 使用货币 rails : How to manually set an attribute's currency

c++ - 将 lambda 传递给 std::thread 并调用类方法

c++11 - 将元素插入 lambda 函数内的向量时出错