Dependencias circulares en Ruby
Digamos que tenemos dos clases, Foo y Foo Sub, cada una en un archivo diferente, foo.rb y foo_sub.rb respectivamente.
foo.rb:
require "foo_sub"
class Foo
def foo
FooSub.SOME_CONSTANT
end
end
foo_sub.rb:
require "foo"
class FooSub < Foo
SOME_CONSTANT = 1
end
Esto no va a funcionar debido a la dependencia circular: no podemos definir ninguna clase sin la otra. Hay varias soluciones que he visto. Quiero evitar dos de ellas, es decir, ponerlas en el mismo archivo y eliminar la dependencia circular. Entonces, la única otra solución que he encontrado es una declaración directa:
foo.rb:
class Foo
end
require "foo_sub"
class Foo
def foo
FooSub.SOME_CONSTANT
end
end
foo_sub.rb
require "foo"
class FooSub < Foo
SOME_CONSTANT = 1
end
Desafortunadamente, no puedo hacer que funcione lo mismo si tengo tres archivos:
foo.rb:
class Foo
end
require "foo_sub_sub"
class Foo
def foo
FooSubSub.SOME_CONSTANT
end
end
foo_sub.rb:
require "foo"
class FooSub < Foo
end
foo_sub_sub.rb:
require "foo_sub"
class FooSubSub < FooSub
SOME_CONSTANT = 1
end
Si necesito foo_sub.rb, entonces FooSub es una constante no inicializada en foo_sub_sub.rb. ¿Alguna idea de cómo solucionar esto sin ponerlos en el mismo archivo ni eliminar la dependencia circular?