在下面的代码中,我有两个类。当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 ...所以解释器如何不进行某种无限循环,如当你有一个递归函数,最终终止于堆栈太深错误?
如何在对象需要了解彼此的情况下重构这样的代码?
答案 0 :(得分:0)
这不是导致一种无限递归吗?
不,没有无限循环/递归。你创造了一个国家,它创造了一个人口,就是这样。 然而,如果在创建时,人口也要创建一个国家,那么 会导致无限递归。但在这种形式下,代码很好。
答案 1 :(得分:-1)
在大多数情况下,是的,但不是红宝石。 为什么?,ruby是一个解释性的lang。 Ruby检查一个类是否仅在需要时存在,例如,当你运行其中一个初始化时。在运行初始化之前,ruby仅检查是否只有语法错误
没有恕我直言。