Ruby私有和公共访问器
发布时间:2020-12-17 03:41:28 所属栏目:百科 来源:网络整理
导读:在 Ruby中定义访问器时,简洁(我们都喜欢)和最佳实践之间可能存在紧张关系. 例如,如果我想在实例上公开一个值但禁止任何外部对象更新它,我可以执行以下操作: class Pancake attr_reader :has_sauce def initialize(toppings) sauces = [:maple,:butterscotch
在
Ruby中定义访问器时,简洁(我们都喜欢)和最佳实践之间可能存在紧张关系.
例如,如果我想在实例上公开一个值但禁止任何外部对象更新它,我可以执行以下操作: class Pancake attr_reader :has_sauce def initialize(toppings) sauces = [:maple,:butterscotch] @has_sauce = toppings.size != (toppings - sauces).size ... 但突然间我正在使用一个原始实例变量,这让我抽搐了.我的意思是,如果我需要在将来设置之前处理has_sauce,我可能需要进行更多的重构,而不仅仅是覆盖访问器.来吧,原始实例变量?布莱什. 我可以忽略这个问题并使用attr_accessor.我的意思是,任何人都可以设置属性,如果他们真的想要;毕竟,这就是Ruby.但后来我失去了数据封装的想法,对象的界面定义不太明确,系统可能更混乱. 另一种解决方案是在不同的访问修饰符下定义一对访问器: class Pancake attr_reader :has_sauce private attr_writer :has_sauce public def initialize(toppings) sauces = [:maple,:butterscotch] self.has_sauce = toppings.size != (toppings - sauces).size end end 这完成了工作,但对于一个简单的存取器而言,这是一大块样板,坦率地说:呃. 那么有更好的,更Ruby的方式吗? 解决方法
attr_reader等只是方法 – 没有理由你可以为自己的用途定义变体(我确实分享你的情绪)例如:
class << Object def private_accessor(*names) names.each do |name| attr_accessor name private "#{name}=" end end end 然后像使用attr_accessor一样使用private_accessor(我认为你需要一个比private_accessor更好的名字) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Oracle案例13—— OGG-01163 Oracle GoldenGate Delivery f
- typedef结构指针定义
- objective-c – 获取正在执行的.app文件的当前路径
- objective-c – 捆绑ID和SKU号码
- ruby-on-rails – Form_for,型号名称与控制器不同
- ruby-on-rails – 为什么帮助者不应该使用html?
- 将XML注释添加到LINQ to SQL设计器生成的类属性
- libnids libpcap libnet 安装中的错误解决方案(mark)
- bootstrap weebox 支持ajax的模态弹出框
- [VB.NET Tips]程序的启动和终止