+是使用super调用父变量后的未定义方法

时间:2012-06-26 20:44:16

标签: ruby

这是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:nil的未定义方法`+':NilClass(NoMethodError)。我知道这个错误有答案,但我还不擅长理解这意味着什么。

要提一点的是,上面的查询必须是它的方式。我不能把Puts放在它面前。

我很感激为什么我得到关于+是一种未定义方法的陈述的任何建议。

谢谢!

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

2 个答案:

答案 0 :(得分:2)

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

首先,您已经在使用attr_reader,为生成

其次,first_name例如应该返回@first_name

def first_name
  @first_name
end

答案 1 :(得分:2)

  

我收到错误:person.rb:31: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