gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:37:39 26 4
gpt4 key购买 nike

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

  1. 让 mixin 方法像任何类方法一样直接访问实例变量,例如 self.text。这样做的问题是它限制了混合方法的使用位置,并强制进行混合的类具有以特定方式命名的特定实例方法。

  2. 将实例变量作为参数传递给 mixin 方法,这将产生如下代码:

例子

self.do_something(self.text)

@thing.do_something(@thing.text)

这看起来很讨厌,而且不符合面向对象的原则。

还有其他方法吗?我的担心对吗?

最佳答案

一般来说,避免让 mixins 访问成员变量:这是一种非常紧密的耦合形式,可能会给 future 的重构带来不必要的困难。

一个有用的策略是让 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 中使用通用和通用数据名称可能会导致冲突。在这种情况下,让 mixin 查找名称不太常见的数据:

module Mixin

def do_something
p mixin_text
end

end

并让包含类定义适当的访问器:

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"

通过这种方式,访问器充当混合数据和包含类数据之间的某种“阻抗匹配器”或“转换器”。

关于ruby - 如何在 mixin 方法中访问实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2295332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com