我是Stackoverflow的新手,我在编码挑战方面遇到了一些麻烦。我需要能够输出总统的年龄,姓名,公民身份以及流行语。我一直收到错误,
堆栈级别太深了 exercise.rb:12任何人都可以解释,出了什么问题?堆栈级别太深意味着什么?
模块总统 attr_accessor:name,:age,:citizenship
def initialize(name, age)
@name, @age, @citizenship = name, age, self.class.citizenship
end
end
class FrancePresident
include Presidential
def citizenship
"#{self.citizenship}, #{catchphrase}"
end
def name
"#{name}, #{catchphrase}"
end
def age
"#{age}, #{catchphrase}"
end
def catchphrase
"bien sur"
end
def self.citizenship
"La France"
end
end
规格:
describe FrancePresident do
describe "catchphrase" do
it "sounds just right" do
expect( FrancePresident.citizenship ).to eq("La France")
sarcozy = FrancePresident.new("Nicolas Sarkozy", 59)
expect( sarcozy.citizenship ).to eq("La France, bien sur")
expect( sarcozy.age ).to eq("59, bien sur")
expect( sarcozy.name ).to eq("Nicolas Sarkozy, bien sur")
end
end
describe "inheritance" do
it "should not inherit from President" do
expect( FrancePresident.superclass.to_s ).not_to eq('President')
end
end
end
答案 0 :(得分:1)
基本上Ruby会让一堆东西等着什么东西,而且它变得太大了:
class FrancePresident
def citizenship
self.citizenship
end
end
sarkozy = FrancePresident.new
sarkozy.citizenship
调用citizenship
方法时,Ruby会执行它。执行是:调用citizenship
方法。在放弃之前,Ruby做了大约10000次。
答案 1 :(得分:0)
也许您可以在问题中添加行号,这样可以更容易地获得确切的行号。 12你的错误..但到目前为止我能看到的是:
def citizenship
"#{self.citizenship}, #{catchphrase}"
end
您正在调用方法"公民身份"在你的实例方法"公民身份" ..这将以堆栈级别结束深入,因为你在方法本身内调用相同的方法..我可以看到你有一个类方法"公民身份& #34 ;.您必须编辑您的实例方法公民身份,如下所示:
def citizenship
"#{FrancePresident.citizenship}, #{catchphrase}"
end
或
def citizenship
"#{self.class.citizenship}, #{catchphrase}"
end
和您的实例方法"公民身份"将保存。在您的实例方法的范围内"公民身份" "自我"是实例,而不是类。在实例之外" self"是班级。
如果你解决这个问题就像我说的那样,你会在" name"和"年龄"实例方法......因为同样的存在..
答案 2 :(得分:0)
我遇到了同样的错误,解决方案在于不从Presidential模块访问名称和年龄变量,而是从FrancePresident类本身访问。
class FrancePresident
attr_accessor :name, :age
def initialize(name, age)
@name = name
@age = age
end
然后调用实例变量@