4

今朝、proc.newはクラス初期化メソッドで機能しますが、ラムダでは機能しないことがわかりました。具体的には、次のことを意味します。

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

上記の場合、結果は次のようになります。

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

何故ですか?

ありがとう!

4

1 に答える 1

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
于 2012-06-21T03:17:26.293 に答える