[英]class_eval issue Ruby
如果所調用的方法以“ plus”開頭,則我嘗試使用class_eval元編程創建方法。 但是,我在整理class_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(或任何數字)時,新創建的方法應將該數字加到正在調用的整數上,並產生新的總和。
謝謝
嘗試這個:
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
更新
這是稍微改進的版本:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.