2011-11-14 17 views
0

呼び出されるメソッドが "plus"で始まる場合は、class_evalを使用してメソッドをメタプログラムで作成しようとしています。しかし、私はplus10(または任意の数)が呼び出されるとclass_evalメソッドclass_evalの問題Ruby

class Adder 
    def initialize(my_num) 
    @my_num = my_num 
    end 
    def my_num 
    @my_num 
    end 
end 
    def method_missing(meth, *args) 
     my_meth = meth.to_s 
     #puts my_meth[0, 4] 
     if my_meth[0, 4] == "plus" then #/plus\d/ then 
      num = my_meth.slice(/\d+/).to_i 

      original_num = self.my_num.to_i 
      my_sum = original_num + num 
      class_eval{ eval{"def #{meth}; @my_int = #{my_sum} return @my_int end\n"}} 
     end 
     else 
     super 
    end 


y = Adder.new(12) 
puts y.plus10 

、新しく作成されたメソッドがコールされてい整数にその番号を追加する必要があり、実際の構文を一緒に入れてトラブルを抱えている、と新しい合計を生成する。

おかげ

答えて

1

はこれを試してみてください:

class Adder 
    def initialize(my_num) 
    @my_num = my_num 
    end 
    def my_num 
    @my_num 
    end 
    def method_missing(meth, *args) 
    my_meth = meth.to_s 
     if my_meth[0, 4] == "plus" then 
     num = my_meth.slice(/\d+/).to_i 
     original_num = my_num 
     my_sum = original_num + num 
     self.class.class_eval do 
      define_method "#{meth}" do 
      my_int = my_sum 
      end 
     end 
     send meth 
     else 
     super 
     end 
    end 
end 
y = Adder.new(12) 
puts y.plus10 # => 22 

UPDATE

と、このわずかに改善されたバージョン:

class Adder 
    def initialize(num) 
    @num = num 
    end 

    def method_missing(name, *args) 
    name_string = name.to_s 
    if /^plus(\d+)/ =~ name_string 
     sum = Regexp.last_match(1).to_i + @num 
     self.class.class_eval do 
     define_method "#{name}" do 
      sum 
     end 
     end 
     send name 
    else 
    super 
    end 
    end 
end 

y = Adder.new(12) 
puts y.plus10 # => 22 
+0

本当にありがとうございました! – user1043856