3, "Silver"=> 2, "Bronze" => 1} -6ren">
gpt4 book ai didi

ruby - 除了读取实例变量,attr_reader 在 ruby​​ 中还有哪些用途

转载 作者:太空宇宙 更新时间:2023-11-03 18:04:05 24 4
gpt4 key购买 nike

我有以下代码片段:

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

我的理解是attr_reader是一个简单快速的工具,可以打印出实例变量以供检查/开发之用。

当我注释掉 attr_reader :type 时离开def <=>(other)事实上,我得到:

modi.rb:15:in `<=>': undefined local variable or method `type' for # 
<Modi:0x005609e878be80 @type="Bronze", @weight=5> (NameError)
Did you mean? @type
from modi.rb:29:in `<'
from modi.rb:29:in `<main>'`

改变 def <=>(other)MODAL_VALS[@type] < MEDAL_VALS[other.type] (当 attr_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>'

为什么是 setter/getter ,attr_reader :type ,在这种情况下有必要吗? (@type 应该工作.. 甚至 self.type - 第一次遇到在同一类的另一个方法中调用实例变量的问题)

请解释。

最佳答案

您可以使用 attr_reader作为创建返回与符号同名的实例变量名称的方法的快捷方式。

您至少有 3 个选择:

  • 使用attr_reader :type加上你的@type = type作业
  • 创建您自己的 def type; @type; end方法
  • 修改您的代码以使用@typeinstance_variable_get :

if MEDAL_VALS[@type] < MEDAL_VALS[other.instance_variable_get('@type')]

attr_reader但是(主要)不用于调试/检查。它用于减少样板代码。

此外,@type确实有效,对于当前实例。您需要调用 @typeinstance_variable_get根据我的最后一个示例,从 other 获取 ivar .

通过 attr_reader :type 添加公共(public)访问器方法或 def type方法使类的意图更加清晰(例如,此 ivar 旨在被访问)

引用资料:

关于ruby - 除了读取实例变量,attr_reader 在 ruby​​ 中还有哪些用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53584937/

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