这是循环引用的情况吗?我应该避免吗?

时间:2016-11-26 13:37:35

标签: ruby circular-dependency circular-reference

在下面的代码中,我有两个类。当Nation类被实例化为一个对象时,它还会为Population类实例化一个对象,并引用该对象。

class Nation

  def initialize(name)
    @name = name
    @population = Population.new(self)
  end

end

class Population

  def initialize(nation)
    @nation = nation
  end

end 

pry(main)> n = Nation.new("Germany")
=> #<Nation:0x0000000b3179e0 @name="Germany", @population=#<Population:0x0000000b3179b8 @nation=#<Nation:0x0000000b3179e0 ...>>>

这是循环引用的情况吗?

是否应该避免这种情况?

为什么Ruby解释器没有出错?这不是导致一种无限递归吗?当我创建对象n时,它带有对象p的引用,它带有对象n的引用,它引用了对象p ...所以解释器如何不进行某种无限循环,如当你有一个递归函数,最终终止于堆栈太深错误?

如何在对象需要了解彼此的情况下重构这样的代码?

2 个答案:

答案 0 :(得分:0)

  

这不是导致一种无限递归吗?

不,没有无限循环/递归。你创造了一个国家,它创造了一个人口,就是这样。 然而,如果在创建时,人口也要创建一个国家,那么 会导致无限递归。但在这种形式下,代码很好。

答案 1 :(得分:-1)

这是循环引用的情况吗?

在大多数情况下,是的,但不是红宝石。 为什么?,ruby是一个解释性的lang。 Ruby检查一个类是否仅在需要时存在,例如,当你运行其中一个初始化时。在运行初始化之前,ruby仅检查是否只有语法错误

是否应该避免这种情况?

没有恕我直言。