加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 是否有任何内置方法可以在Ruby中的实例变量上

发布时间:2020-12-17 02:11:27 所属栏目:百科 来源:网络整理
导读:我正在使用 Ruby和Rails,因此 Ruby的任何Rails扩展都应该没问题. 我想知道是否有办法有效地强制实例变量(而不是它们的setter和getter)上的类型比手动定义它们更容易. 类方法attr_accessor等不强制执行类型.我注意到例如Rails的ActiveRecord :: Base类在sette
我正在使用 Ruby和Rails,因此 Ruby的任何Rails扩展都应该没问题.

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

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

有没有办法搞定这个?

我可以把我自己的getter和setter写成类方法,但如果聪明的人已经完成了繁重的工作,我宁愿不必相信自己.

解决方法

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读