动态获取参数验证装饰器的Ruby方法签名

时间:2016-06-11 18:17:18

标签: ruby arguments metaprogramming

我正在编写一个小工具来验证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没有提供有关默认参数值的信息。

有没有办法实现我的目标?

0 个答案:

没有答案