ruby – 如何在mixin方法中访问实例变量?

如何在一个mixin方法中访问一个实例变量?我可以想到两种方式,但两者似乎都有问题.

>让mixin方法直接访问实例变量,就像任何类的方法一样,例如self.text.这样做的问题是它限制了可以使用mixin方法的位置,并强制执行混合的类具有以特定方式命名的特定实例方法.
>将实例变量作为参数传递给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"

以这种方式,访问器在混合数据和包含类的数据之间作为一种“阻抗匹配器”或“翻译器”.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...