带条件的递归方法

时间:2015-06-10 18:08:51

标签: ruby

使用Ruby 2.0。这是我的代码:

module Test
  class A
    def initialize(x)
      @x = x
      foo
    end

    def foo
      p @x
      update(@x) # only if it's a Test::C object or called from Test::C
    end
  end
end

module Test
  class B < A
    def foo
      @x += 2
      super
    end
  end
end

module Test
  class C < A
    def foo
      @x += 1
      super
    end
  end
end

def update(x)
  if x > 100
    Test::B.new(x)
  else
    Test::C.new(x)
  end
end

x = 100
update(x)

这是我想要实现的目标:

Test::A#foo中,update(@x)只有在Test::C#foo或其Test::C对象调用时才会被调用。 < / p>

首次调用update(x) x = 100,因此操作应+1,然后转到Test::B#foo一次。我如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

父类不应该关心子类。你在这里设计的这种设计意味着它需要知道,它被打破并使事情过于复杂。

无论如何,如果你确实需要陷入某些情况:

case (self)
when Test::A, Test::B
  # ... Do stuff
  update(@x)
end

如果Test::ATest::B关心该操作,他们应该在必要时调用它:

def foo
  @x += 1
  super
  update(x)
end