我正在编写一个小工具来验证Ruby中的方法参数。理想情况下,功能如下:
class Test
extend ArgValidator
def say(word)
puts word
end
validate_args(:say) do
raise(ArgumentError) if not word.is_a?(String)
end
end
Test.new.say(3) # => ArgumentError
也就是说,ArgValidator
模块提供了一个validate_args
方法,该方法采用实例方法名称和块。调用validate_args(<meth>)
会导致验证代码(在块中提供)在方法体之前运行。针对方法体的绑定执行验证块。我特别努力的上述代码有两个特性:
我目前的方法是使用验证码validate_args
装饰目标方法。通过使用Method#parameters
,我可以从目标方法获取签名信息,并且非常接近动态复制方法体本身的绑定。不幸的是,#parameters
没有提供有关默认参数值的信息。
有没有办法实现我的目标?