你需要把论点传给
can_execute
所以它可以把它们传给
public_send
. splat接线员是你的朋友。当用作参数时,它将把任意数量的参数包装成一个具有其名称的数组。在数组上使用时,它将数组分解为参数以传递给方法。
除此之外,
class
是一个关键字。惯例是
klass
,但它可以是你想要的任何东西(除了类)
考虑到这一点,我们的新方法如下:
def can_execute (klass, method_name, *args)
if klass.respond_to?(method_name.to_sym) && klass.class_methods.include?(method_name.to_sym)
klass.public_send(method_name, *args)
end
end
然后调用,它可以有参数也可以没有。无需先检查:
can_execute('teststring', :slice, 1, 5) # => "ests"
can_execute('teststring', :upcase) # => "TESTSTRING"
如果有其他原因要检查参数,可以使用
Method#arity
或
Method#parameters
. 像这样的结果
#slice
klass.method(method_name.to_sym).arity # => -1
klass.method(method_name.to_sym).parameters # => [[:rest]]