2

私はコードをもっている

class A < BasicObject

    def initialize var1, *args, &block
      if var1 == :lambda
        @var1 = lambda &block
      end
    end
end

a = A.new :lambda, 123  do |var|
  puts "ha ha ha"
end

なぜエラーが発生するのですか?

undefined method `lambda' for #<A:0x00000001687968> (NoMethodError)

これとは異なり(それはそれを引き起こしません)

class A
   def initialize var1, *args, &block
      if var1 == :lambda
        @var1 = lambda &block
      end
    end
end
4

2 に答える 2

7

lambdaメソッドはモジュールで定義されますKernelObject含まれていKernelます。BasicObjectではない。したがってlambda、BasicObject から使用する場合は、それを as として呼び出す必要があります::Kernel.lambda

これは固有のものではないことに注意してくださいlambda- 他のカーネルメソッド ( などputs) にも適用されます。

PS: は単に を書くのと同じことを行うことに注意して@var1 = lambda &blockください。@var1 = blocklambda

于 2013-01-11T22:18:34.617 に答える
0

BasicObject を明示的な Blank クラスであり、具体的には Kernel を含まない基本クラスとして使用しているため、Kernel メソッドにアクセスするときは修飾子 ::Kernel が必要です。

別のメモで -

ブロックがあるという引数を渡す代わりに、カーネル メソッド block_given? を使用できます。だからあなたの例を取る -

class A
  def initialize  *args, &block
    if block_given?
      @var1 = lambda &block
    end
    puts @var1.call
  end
end
a = A.new  123  do |var|
  puts "ha ha ha"
end
于 2013-01-11T23:56:14.437 に答える