6

明確にするために-このコードは完全に実行されています-procを使用したコード

しかし、代わりに Proc.new をラムダに変更すると、エラーが発生します

ArgumentError: wrong number of arguments (1 for 0)

これは、instance_eval が自分自身をパラメーターとして渡したいのに、ラムダがメソッドとして扱い、未知のパラメーターを受け入れないためでしょうか?

2 つの例があります - 最初は動作しています:

class Rule
  def get_rule
    Proc.new { puts name }
  end
end

class Person
  attr_accessor :name

  def init_rule 
    @name = "ruby"
    instance_eval(&Rule.new.get_rule)
  end
end

2 番目は:

class Rule
  def get_rule
    lambda { puts name }
  end
end

class Person
   attr_accessor :name

   def init_rule 
     @name = "ruby"
     instance_eval(&Rule.new.get_rule)
   end
end

ありがとう

4

1 に答える 1

4

あなたは実際にあなたの仮定で正しいです。Self は、ラムダに渡されているProcので、ラムダに渡されていinstance_evalます。Procs とラムダの主な違いは、ラムダは渡されるブロックのアリティをチェックすることです。

そう:

 class Rule
   def get_rule
     lambda { |s| puts s.inspect; puts name; }
   end
 end


class Person
   attr_accessor :name

   def init_rule 
     @name = "ruby"
     instance_eval(&Rule.new.get_rule)
   end
end

 p = Person.new
 p.init_rule

 #<Person:0x007fd1099f53d0 @name="ruby">
 ruby 

ここで、ラムダにアリティ 1 のブロックを期待するように指示しました。引数の検査でわかるように、引数は実際にselfは Person クラスのインスタンスです。

于 2013-05-14T19:26:14.810 に答える