堆栈级别太深,模块和 类
Stack Level Too Deep, Modules and Classes
我是 Whosebug 的新手,在编码挑战中遇到了一些问题。我需要能够输出总统的年龄、姓名、国籍以及标语。我一直收到错误,
堆栈级别太深
exercise.rb:12
谁能解释一下,怎么了?堆栈级别太深是什么意思?
模块总统
attr_accessor :姓名, :年龄, :公民身份
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
基本上Ruby 保持一堆东西在等待什么,而且它变得太大了:
class FrancePresident
def citizenship
self.citizenship
end
end
sarkozy = FrancePresident.new
sarkozy.citizenship
当 citizenship
方法被调用时,Ruby 会执行它。执行是:调用citizenship
方法。 Ruby 在放弃之前这样做了大约 10000 次。
也许您可以在您的问题中添加行号,这样可以更容易地获得确切的行号。 12 从你的错误..但到目前为止我能看到的是:
def citizenship
"#{self.citizenship}, #{catchphrase}"
end
您正在实例方法 "citizenship" 上调用方法 "citizenship"。这将以堆栈级别结束,因为您在方法本身内部调用了相同的方法。我可以看到你有一个 class 方法 "citizenship"。您必须像下面这样编辑您的实例方法公民身份:
def citizenship
"#{FrancePresident.citizenship}, #{catchphrase}"
end
或
def citizenship
"#{self.class.citizenship}, #{catchphrase}"
end
您的实例方法 "citizenship" 将被保存。在实例方法 "citizenship" 的范围内,"self" 是实例而不是 class。在实例 "self" 之外是 class.
如果你像我说的那样解决这个问题,你会在 "name" 和 "age" 实例方法上遇到下一个错误...因为相同的理由..
我遇到了同样的错误,解决方案是不从 Presidential 模块访问 name 和 age 变量,而是从 FrancePresident class 本身访问。
class FrancePresident
attr_accessor :name, :age
def initialize(name, age)
@name = name
@age = age
end
然后你调用实例变量@
我是 Whosebug 的新手,在编码挑战中遇到了一些问题。我需要能够输出总统的年龄、姓名、国籍以及标语。我一直收到错误,
堆栈级别太深 exercise.rb:12
谁能解释一下,怎么了?堆栈级别太深是什么意思?
模块总统 attr_accessor :姓名, :年龄, :公民身份
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
基本上Ruby 保持一堆东西在等待什么,而且它变得太大了:
class FrancePresident
def citizenship
self.citizenship
end
end
sarkozy = FrancePresident.new
sarkozy.citizenship
当 citizenship
方法被调用时,Ruby 会执行它。执行是:调用citizenship
方法。 Ruby 在放弃之前这样做了大约 10000 次。
也许您可以在您的问题中添加行号,这样可以更容易地获得确切的行号。 12 从你的错误..但到目前为止我能看到的是:
def citizenship
"#{self.citizenship}, #{catchphrase}"
end
您正在实例方法 "citizenship" 上调用方法 "citizenship"。这将以堆栈级别结束,因为您在方法本身内部调用了相同的方法。我可以看到你有一个 class 方法 "citizenship"。您必须像下面这样编辑您的实例方法公民身份:
def citizenship
"#{FrancePresident.citizenship}, #{catchphrase}"
end
或
def citizenship
"#{self.class.citizenship}, #{catchphrase}"
end
您的实例方法 "citizenship" 将被保存。在实例方法 "citizenship" 的范围内,"self" 是实例而不是 class。在实例 "self" 之外是 class.
如果你像我说的那样解决这个问题,你会在 "name" 和 "age" 实例方法上遇到下一个错误...因为相同的理由..
我遇到了同样的错误,解决方案是不从 Presidential 模块访问 name 和 age 变量,而是从 FrancePresident class 本身访问。
class FrancePresident
attr_accessor :name, :age
def initialize(name, age)
@name = name
@age = age
end
然后你调用实例变量@