堆栈级别太深,模块和 类

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

然后你调用实例变量@