2013-05-14 7 views
5

エラー「の引数の数が間違っ」を持って現在のコンテキストを渡すためにinstance_evalを(&ラムダ)を呼び出すときに - このコードは完全に実行されている - code with proc明確にするため

代わりにあれば、私はラムダにProc.newを変更、私はエラー

ArgumentError: wrong number of arguments (1 for 0) 

を取得することはinstance_evalををPARAMとして自己を渡したいためであること、そして方法としてラムダ扱いと未知のparamsを受け入れないことはできますか?

二つの例がある - 最初に取り組んでいる:

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 

は、第二ではありません:あなたは、あなたの前提で、実際に正しい

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

。自己は 'であるので、Procとラムダに渡されています。 Procsとlambdaの主な違いは、lambdaがブロックに渡されるブロックのアリティをチェックすることです。

ので:

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

p = Person.new 
p.get_rule 

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

私はアリティ1でブロックを期待するラムダを告げ、あなたが引数の検査に見るように、引数は確かに、Personクラスのインスタンスであるself

+0

'p.init_rule'ではなく' p.get_rule'ですか? – artificis

関連する問題