是否有任何内置方法可以在Ruby中的实例变量上自动强制执行类型/类?

时间:2011-07-03 18:06:06

标签: ruby-on-rails ruby

我正在使用Ruby和Rails,所以Ruby的任何Rails扩展都应该没问题。

我想知道是否有办法有效地强制实例变量(而不是它们的setter和getter)上的类型比手动定义它们更容易。

类方法attr_accessor等不强制执行类型。我注意到例如Rails'ActiveRecord::Base类在setter上进行自动转换。它从数据库中知道特定的活动记录变量是一个整数,并使用@record.integer_variable = '1'设置它会自动转换参数并允许通过@record.integer_variable # => 1进一步访问。

有没有办法解决这个问题?

我可以把我自己的吸气剂和制定者写成课堂方法,但如果聪明的人已经完成了繁重的工作,我宁可不必相信自己。

1 个答案:

答案 0 :(得分:2)

我不知道是否已有关于它的内容,但你可以通过几行元编程来解决这个问题:

module EnforceTypes
  def attr_accessor_of_type(name, type)
    send :define_method, name do
      instance_variable_get("@#{name}")
    end
    send :define_method, "#{name}=" do |v|
      raise ArgumentException unless v.is_a? type
      instance_variable_set("@#{name}", v)
    end
  end
end

用法:

class MyClass
  extend EnforceTypes

  attr_accessor_of_type :some_string, String
end

当然,你可以通过改变第二种发射方法,进行一些转换等来使它变得有点聪明。

这是一个很好的参考:http://www.raulparolari.com/Ruby2/attr_accessor

请记住,通过手动复制和粘贴大量代码,您几乎可以做的任何事情都可以通过元编程来解决。