除了读取实例变量,attr_reader在ruby中还有什么其他用途
我有以下代码片段:除了读取实例变量,attr_reader在ruby中还有什么其他用途,ruby,Ruby,我有以下代码片段: class Modi include Comparable MEDAL_VALS = {"Gold" => 3, "Silver"=> 2, "Bronze" => 1} #commenting out attr_reader below breaks the code attr_reader :type def initialize(type) @type = type end def <=>(oth
class Modi
include Comparable
MEDAL_VALS = {"Gold" => 3, "Silver"=> 2, "Bronze" => 1}
#commenting out attr_reader below breaks the code
attr_reader :type
def initialize(type)
@type = type
end
def <=>(other)
MEDAL_VALS[type] <=> MEDAL_VALS[other.type]
end
end
将def(other)
更改为MODAL\u VALS[@type]
(当attr\u reader被注释掉时)会导致此错误:
modi.rb:15:in `<=>': undefined method `type' for #
<Modi:0x0055e62ce2feb0 @type="Silver", @weight=10> (NoMethodError)
from modi.rb:29:in `<'
from modi.rb:29:in `<main>'
modi.rb:15:in``:
(命名者)
在modi.rb:29:in`中,您可以使用attr\u reader
作为快捷方式,创建一个返回与符号同名的实例变量名的方法
您至少有3个选项:
- 将
attr\u reader:type
与@type=type
作业结合使用
- 创建自己的
def类型@类型;结束
方法
- 修改代码以使用
@type
和实例变量\u get
:
如果奖牌价值[@type]
然而,attr_reader
不(主要)用于调试/检查。它用于减少样板代码
另外,@type
对当前实例也有效。根据我的上一个示例,您需要使用实例变量\u get
调用@type
,以从其他
获取ivar
通过attr\u reader:type
或def type
方法添加公共访问器方法,可以使类的意图更加清晰(例如,本ivar旨在访问)
参考资料:
“破坏代码”是如何做到的?这三个版本的代码对我来说都很好。您可以使用@type
或self.type
。那么你的问题是什么呢?顺便说一句,你的方法太复杂了。您可以将其定义为:indalum\u VALS[type]indalum\u VALS[other.type]
此外,attr\u reader
不仅用于开发/调试。正如您自己所说,它定义了一个getter方法。这允许您通过公共实例方法访问变量。这可能有很多好处。@foo您正在调用other。请在
的定义中键入。
modi.rb:15:in `<=>': undefined method `type' for #
<Modi:0x0055e62ce2feb0 @type="Silver", @weight=10> (NoMethodError)
from modi.rb:29:in `<'
from modi.rb:29:in `<main>'