比如这样一个 python 的 decorator
def double_arguments(func):
def f(*args):
return func(*[x * 2 for x in args])
return f
@double_arguments
def add(a, b, c):
return a + b + c
@double_arguments
def mul(a, b, c):
return a * b * c
print add(1, 2, 3) # => 12
print mul(1, 2, 3) # => 48
double_arguments 会修改 add 和 mul 的定义,使传递给他们的参数都先乘以 2,再传递给原函数
如果 decorator 只能改变返回值,那是实现不了这个效果的
decorator 的实现里面,不仅可以引用到原先定义的函数/方法,也可以引用到实际调用时的参数
所以 ruby 可能可以写成这样?
class Batman < RubyDecorator
def call(func)
lambda {|*args|
func(*args).sub('world', 'batman')
}
end
end