初始化()中的Ruby proc与lambda

Jim*_*Chu 4 ruby lambda proc

我今天早上发现proc.new在类初始化方法中工作,但不是lambda.具体来说,我的意思是:

class TestClass

  attr_reader :proc, :lambda

  def initialize
    @proc = Proc.new {puts "Hello from Proc"}
    @lambda = lambda {puts "Hello from lambda"}
  end

end

c = TestClass.new
c.proc.call
c.lambda.call
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,结果将是:

Hello from Proc
test.rb:14:in `<main>': undefined method `call' for nil:NilClass (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

这是为什么?

谢谢!

Mau*_*res 6

您定义了一个attr_accessor被调用的事实lambda是隐藏了lambda创建一个块的原始方法(因此您的代码实际上隐藏了Ruby lambda).您需要为该属性命名其他内容才能使其工作:

class TestClass

  attr_reader :proc, :_lambda

  def initialize
    @proc = Proc.new {puts "Hello from Proc"}
    @_lambda = lambda {puts "Hello from lambda"}
  end

end

c = TestClass.new
c.proc.call
c._lambda.call
Run Code Online (Sandbox Code Playgroud)

  • 调用“Kernel.lambda”是另一种选择。 (2认同)