在Ruby中重现类新方法(初始化)是否允许并且安全?

时间:2014-05-13 16:51:44

标签: ruby class recursion new-operator

我是面向对象编程/建模的新手,我一直在使用Ruby来编写一些平面图算法。我想做的是这样的事情:

class Twin

  def initialize(name1,name2)
  ## creates two twin brothers and "returns" one of them
  end

  def name
    @name
  end

  def brother
    @brother
  end

end

我发现没有办法在一次初始化中创建两个双胞胎,除非重复出现如下:

  def initialize(name1,name2)
    if @@flag.nil?
      @@flag = self
      @mybrother = Twin.new(name1,name2)
      @name = name1
    else
      @mybrother = @@flag
      @@flag = nil
      @name = name2
    end
  end

我是否可以在initialize方法中使用递归?我实现了这个方法,它似乎工作。但我不确定它是否依赖于解释器版本。

我知道我可以写一个类Person和第二个类Twin来创建并成对加入它们。但对我来说这似乎是一个人为的造型。我试图模仿我几年前使用记录在C中写的数据结构。


编辑:根据@iamnotmaynard的建议挖掘了很多东西之后,我按照以下方式重写了我的代码:

class Twin

  def self.generate_twins(name1,name2)
    t1 = Twin.allocate
    t2 = Twin.allocate
    t1.instance_variable_set(:@name, name1)
    t1.instance_variable_set(:@brother, t2)
    t2.instance_variable_set(:@name, name2)
    t2.instance_variable_set(:@brother, t1)
    t1
  end

  def initialize
    raise "Use generate_twins to create twins"
  end

  def name
    @name
  end

  def brother
    @brother
  end

end

这段代码表达了我在寻找没有初始化递归的东西。谢谢大家的答案和评论,帮助我找到它。

2 个答案:

答案 0 :(得分:0)

您应该创建一个新的类方法来创建这两个双胞胎。我不会像那样使用初始化器。

答案 1 :(得分:0)

我建议为此分开课程。

我不确定twins是由什么构成的,但你可以创建一个类Single,它将保存与单个相关的方法,然后是另一个类“Twin”,你将两个Single传递给。

实施例

Class Single 
    def initialize(..)
        #Initialize the single object here
    end
    #include any methods relevant to the single object
end

Class Twin
    def initialize(single1, single2)
        #store the singles in the class
    end
    #Put methods that use both singles here
end