ruby – 如何在mixin方法中访问实例变量?
发布时间:2020-12-16 20:04:47 所属栏目:百科 来源:网络整理
导读:如何在一个mixin方法中访问一个实例变量?我可以想到两种方式,但两者似乎都有问题. 让mixin方法直接访问实例变量,就像任何类的方法一样,例如self.text.这样做的问题是它限制了可以使用mixin方法的位置,并强制执行混合的类具有以特定方式命名的特定实例方法.
如何在一个mixin方法中访问一个实例变量?我可以想到两种方式,但两者似乎都有问题.
>让mixin方法直接访问实例变量,就像任何类的方法一样,例如self.text.这样做的问题是它限制了可以使用mixin方法的位置,并强制执行混合的类具有以特定方式命名的特定实例方法. 例 self.do_something(self.text) 要么 @thing.do_something(@thing.text) 对我来说看起来很讨厌,不符合面向对象的原则. 有什么办法吗?我有权利关心吗? 解决方法
一般来说,避免使用mixin访问成员变量:这是一种非常紧凑的耦合形式,可以使未来的重构变得不必要.
一个有用的策略是Mixin总是通过访问器访问变量.所以,而不是: #!/usr/bin/ruby1.8 module Mixin def do_something p @text end end class Foo include Mixin def initialize @text = 'foo' end end Foo.new.do_something # => "foo" mixin访问由包含类定义的“文本”访问器: module Mixin def do_something p text end end class Foo attr_accessor :text include Mixin def initialize @text = 'foo' end end Foo.new.do_something # => "foo" 如果您需要在本课中包含Mixin,该怎么办? class Foo def initialize @text = "Text that has nothing to do with the mixin" end end 在包含类使用相同的名称时,在混合中使用通用和通用数据名可能会导致冲突.在这种情况下,让mixin以较不常见的名称查找数据: module Mixin def do_something p mixin_text end end 并让include类定义适当的访问器: class Foo include Mixin def initialize @text = 'text that has nothing to do with the mixin' @something = 'text for the mixin' end def mixin_text @something end end Foo.new.do_something # => "text for the mixin" 以这种方式,访问器在混合数据和包含类的数据之间作为一种“阻抗匹配器”或“翻译器”. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |