下面的程序是一个试图吸收美国总统,法国总统的年龄和名字。问题是,这位法国总统在称呼他的名字、年龄和公民身份后说“bein sur”(不是我的想法)。我对法国总统的流行语有意见这是我的密码

class President
  attr_accessor :name, :age

  def initialize(name, age)
    @name = name
    @age = age
  end

end

class FrancePresident < President
  def self.citizenship
    "La France"
  end

  def initialize(name, age)
    super(name, age)
  end

 def catchphrase
    "bien sur"
  end

   def name
    "#{name}, #{catchphrase}"
   end

   def age
    "#{age}, #{catchphrase}"
   end

   def citizenship
     "#{self.class.citizenship}, #{catchphrase}"
   end
end

class UnitedStatesPresident < President
  def self.citizenship
    "The Unites States of America"
  end
end

我认为我没有正确地引用超类,因为我收到了下面的堆栈错误。
SystemStackError
stack level too deep
exercise.rb:29

我是鲁比的新手,所以任何洞察都会有帮助。

最佳答案

函数生成无限递归,因为它调用自己:

def name
    "#{name}, #{catchphrase}" # <-- here, name calls this very function again and again
end

name也一样。它们应该分别调用实例变量age@name
def name
    "#{@name}, #{catchphrase}"
end

def age
    "#{@age}, #{catchphrase}"
end

编辑
最好还是使用@age而不是实例变量,因为它清楚地表明您正在使用基类中的功能并向它添加一些内容(谢谢提示,tadman!):
def name
    "#{super}, #{catchphrase}"
end

def age
    "#{super}, #{catchphrase}"
end

10-07 16:34