Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
除了读取实例变量,attr_reader在ruby中还有什么其他用途_Ruby - Fatal编程技术网

除了读取实例变量,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>'