我这周刚开始在bloc上课。我和鲁比一起练了3个月,但最后还是被卡住了。希望能得到一些帮助。
我要上的部分是关于超级
以下是简单格式的规范:
初始化时,President类应接受nameage,并为这两个属性定义getter和setter。
FrancePresidentUnitedStatesPresident应该继承自President
President的两个子类应定义一个citizenship类方法,该方法根据需要返回"La France""The United States of America"
所有的President实例都应该有citizenship方法,这些方法返回类的公民身份。
当要求FrancePresident", bien sur"name时,age的所有实例都应在其响应中附加一个citizenship。这是个很好的例子
以下是我要满足的RSPEC规范:

describe President do
  describe "initialization" do
    it "takes a name and age, and delegates citizenship to the class default" do
      prez = President.new("George Washington", 283)
      expect( prez.name ).to eq("George Washington")
      expect( prez.age ).to eq(283)
    end
  end

  describe "children" do
    it "is the parent of FrancePresident and UnitedStatesPresident" do
      expect( FrancePresident.superclass ).to eq(President)
      expect( UnitedStatesPresident.superclass ).to eq(President)
    end
  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
end

这是我目前的代码:
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
end

class UnitedStatesPresident < President
  def self.citizenship
    "The United States of America"
  end
end

总之,我一直在努力让citizenship类方法工作。从这些指令看来,他们几乎希望我在citizenship中定义一个President类方法。但我不明白这是怎么做到的,也不符合规格,因为你不能为每个孩子单独设置公民身份。
所以基本上我被困在第三和第四个目标上。如果你有时间的话,请给我回电话。

最佳答案

在您的规范中,您期望两种类型的citizenship响应。一个有流行语,一个没有。所以你必须有两种不同的方法。一个类方法,一个实例方法。应该遵循以下原则:

class FrancePresident < President
  def self.citizenship
    "La France"
  end

  # instance method which adds the catchphrase
  def citizenship
    append_catchphrase(self.class.citizenship)
  end

  # here's your super
  def age
    append_catchphrase(super)
  end

  def catchphrase
    'bien sur'
  end

  private

  def append_catchphrase(val)
    [val, catchphrase].join(', ')
  end
end

关于ruby-on-rails - Ruby类( super ),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30111275/

10-11 17:39