2011-11-14 166 views
0

我想用class_eval來創建一個方法元編程,如果被調用的方法以「加號」開頭。然而,我無法放在一起的class_evalclass_eval問題紅寶石

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 

的實際語法當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