【问题标题】:+ is an undefined method after using super to call parent variables+ 是使用 super 调用父变量后未定义的方法
【发布时间】:2012-06-26 20:44:16
【问题描述】:

这是Creating a class which inherits from another class in Rubym.one + m.two + m.three doesn't work 的后续报道。我们正在申请App Academy,这是一个针对经验很少或没有经验的人的学习编程课程。结果,这些问题是相似的,但我觉得其他两篇文章中的答案并没有解决答案,而是分歧于解释切线概念(我确实利用了)

为了跟进前面提到的两个链接,我遇到了继承类的问题。我有 Musician 类,它从 Person 类继承了三个变量。我的问题是当我运行

m.first_name + " " + m.last_name + ": " + m.age.to_s

我收到一个错误:person.rb:31: undefined method `+' for nil:NilClass (NoMethodError)。我知道这个错误有答案,但我还不擅长理解这意味着什么。

有一点要提的是,上面的查询,一定是这样的。我不能把 Puts 放在它前面。

如果我收到关于 + 是未定义方法的声明的任何建议,我将不胜感激。

谢谢!

编辑:感谢您的快速回复。我没有意识到编码社区如此活跃!这真是太神奇了。我将编辑代码以反映最新问题,因此我不会一直收到相同的建议。

【问题讨论】:

  • 呃;标签。让事情变得困难。让圣战开始吧。
  • @DaveNewton 哈哈哈- 谢谢 :)

标签: ruby


【解决方案1】:

我收到一个错误:person.rb:31: undefined method `+' for nil:NilClass (NoMethodError)。我知道这个错误有答案,但我还不擅长理解这意味着什么。

表示三个变量之一是nil,即缺少值:

m.first_name
m.last_name

发生这种情况是因为您正在返回在所有访问器中调用 puts 函数的结果。您需要返回变量本身,而不是打印它们并返回打印函数的结果

此外,由于您已经在使用 attr_reader,因此您已经为您创建了 get 方法。这就是使用attr_reader 的全部意义所在;它会创建一个为您返回底层实例变量的函数,您只需对其进行初始化。

例如,这个:

class Foo
  def bar
    @bar
  end
end

等价于

class Foo
  attr_reader :bar
end

【讨论】:

  • @DaveNewton:哈哈,我注意到我第一眼就错过了一些东西......很多次。
  • @EdS。哦,哇-感谢您解释 attr_reader。我删除了接受性。我仍然不明白的一件事是,我如何得到: m = Musician.new("George", "Harrison", 58, "guitar") m.first_name + " " + m.last_name + ": " + m .age.to_s m.instrument 打印?
  • @LKBGIFT 查看attr_reader 文档——我强烈反对随意使用功能!
  • @DaveNewton : / 我不会再犯这个错误了。我通读了一遍,但此时我无法理解。始终要考虑的关键点-:)
  • @LKBGIFT:在“真实”应用程序中,您可能不会在类似的 getter 方法中包含 puts,而且您肯定不会返回 puts 返回的内容。如果你想在外部打印变量,而不是在方法本身内部。
【解决方案2】:

您的访问器正在返回 puts 的结果,而不是实例变量的值。

首先,您已经在使用attr_reader,它会为您生成这些方法。

第二个,例如first_name,应该只返回@first_name

def first_name
  @first_name
end

【讨论】:

  • 知道了——所以我删除了 puts 并专注于使用 attr_reader。现在我的问题是我不知道如何在下面的请求中打印一个非 Puts 变量。这是一个奇怪的情况,因为我需要使用查询 m = Musician.new("George", "Harrison", 58, "guitar") m.first_name + " " + m.last_name + ": " + m.age .to_s m.instrument
  • @LKBGIFT 我不太明白你的意思(这不是“查询”)。在不知道具体要做什么的情况下,很难提供帮助。
  • @LKBGIFT 如果您在谈论您链接到的页面底部的代码,它们会在irb(或repl.it 等)内运行代码并评估立即表达式。如果您想从脚本文件中查看这些值,您需要使用puts.
  • @DaveNewton 我的问题是我需要在底部显示代码:然后你应该创建一个继承自 Person 类的 Musician 类。您应该能够执行以下操作: > m = Musician.new("George", "Harrison", 58, "guitar") > m.first_name + " " + m.last_name + ":" + m.age。 to_s => "George Harrison: 58" > m.instrument => "guitar" 当我在方法中使用 puts 时,就像我之前所做的那样,变量返回 nil...
  • @LKBGIFT 但正如我所说,你做错了。您要么需要 (a) 立即从 repl(irb、repl.it 等)评估它,要么在脚本文件中使用 puts。你过于专注于让某样东西看起来与其他东西完全一样,而不是学习它试图教给你的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 2019-02-19
相关资源
最近更新 更多