下面的程序是一个试图吸收美国总统,法国总统的年龄和名字。问题是,这位法国总统在称呼他的名字、年龄和公民身份后说“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