堆栈级别太深,模块和类

时间:2015-03-09 21:45:11

标签: ruby class module stack

我是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

3 个答案:

答案 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

然后调用实例变量@