let's trace
[pre lang="ruby"]$sm=[]
class Class
def sm(sym)
self.class_eval do
return if (@@__smed||=[]).include?(sym)
@@__smed.push sym
alias :"old_#{sym}" :"#{sym}"
define_method sym do |*args, &block|
$sm << [self, sym, *args]
old = $sm[-1]
old.push self.send(:"old_#{sym}", *args, &block)
old[-1]
end
end
end
end
$sm=[]
class A
attr_accessor :size
def initialize
@size = 0
end
def size
return @size / 2
end
sm :size
sm :size=
end
$a = A.new
$a.size += 1
$a.size += 1
$a.size += 1
$a.size += 1
$a.size += 1
p $a.size
puts "\nsm result: "
puts $sm.map { |j| j.join "\t" }.join "\n"[/pre]
我的言论只代表我个人的观点,不代表雇主及/或任何第三方的立场。
Opinions expressed are solely my own and do not express the views or opinions of my employer and/or any third parties. 捐赠 | GitHub