Ruby Factory方法找不到属性?

时间:2014-10-15 05:21:36

标签: ruby attributes factory

以下Ruby代码几乎可以正常工作。在Mage和Warrior类中,我给它一个属性toon并想要打印出值,但它给了我这个错误。

C:/rails/11.rb:37:<main>': undefined method toon&#39; #(NoMethodError)

任何人都知道出了什么问题?

class Party
    attr_reader :member

    def initialize(occupation)
        member = create(occupation)
    end
end

class PartyFactory < Party
    def create(occupation)
        if occupation == :warrior
            Warrior.new
        elsif occupation == :mage
            Mage.new
        else
            raise "Unknown hero"
        end
    end
end

class Mage
    attr_accessor :toon
    def initialize
        @toon = "woor"
    end
end

class Warrior
    attr_accessor :toon
    def initialize
        @toon = "WAR"
    end
end

party = PartyFactory.new(:warrior)

puts party.toon

2 个答案:

答案 0 :(得分:1)

您创建了一个派对对象。在该Party对象中,您创建了一个warrior对象,但是您没有将它保存到对象中,因此无法在类外部访问它。

例如,如果你这样做:

@warrior = Warrior.new

现在你可以像这样访问那个战士:

party.warrior.toon

编辑:确保将warrior添加为attr_reader

答案 1 :(得分:0)

您的PartyFactory课程有一些问题。如果这个类实际上是一个工厂,它不应该从Party类继承。它应该是一个完全不同的类,负责创建聚会。

我会更改Party构造函数以直接获取其成员。

class Party
  attr_reader :member

  def initialize(member)
    @member = member
  end
end

我会更改PartyFactory类,使其不会从Party类继承。

class PartyFactory
  def create(occupation)
    if occupation == :warrior
      Warrior.new
    elsif occupation == :mage
      Mage.new
    else
      raise "Unknown hero"
    end
  end
end

要调用toon方法,首先需要与工厂一起创建聚会,然后在聚会成员上调用toon方法。

factory = PartyFactory.new
party = factory.create(:warrior)
party.member.toon