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

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

发布时间:2020-12-16 20:04:47 所属栏目:百科 来源:网络整理
导读:如何在一个mixin方法中访问一个实例变量?我可以想到两种方式,但两者似乎都有问题. 让mixin方法直接访问实例变量,就像任何类的方法一样,例如self.text.这样做的问题是它限制了可以使用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"

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

(编辑:李大同)

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

    推荐文章
      热点阅读