在我的一个项目中,我需要将两个类定义放在一个文件中,将它们的父类放在另一个文件中。在我需要父文件后,它仍然提供uninitialized constant Foo
。查看下面的代码。问题是:如何使它工作(从文件2运行)?
#file1.rb
require_relative './file2.rb'
class Bar < Foo
get('/bar') { 'bar' }
end
class Car < Foo
end
#file2.rb
require_relative './file1.rb'
class Foo
get('/foo') { 'foo' }
end
class Dar < Foo
Bar.new
Car.new
end
答案 0 :(得分:0)
首先定义父类,然后定义派生类。这也使您的代码更易于导航,因为它以可预测的顺序,先决条件优先,后期专业化。
最后定义是不可能的,Ruby绝对需要知道Foo
是什么。尽管如此,你可以躲开它:
class Foo
end
class Bar < Foo
end
class Foo
# Re-open class and add functionality
get('...)
end
我建议尽可能避免这种做法。它通常最终会在两个地方累积代码,并且可能发生令人讨厌的重复错误。
答案 1 :(得分:0)
我不确定这个问题是否与循环依赖有关,但我确实想办法避免这个bug。使用另一个文件需要两个文件,并从新文件执行。
#file1.rb
class Bar < Foo
get('/bar') { 'bar' }
end
class Car < Foo
end
#file2.rb
class Foo
get('/foo') { 'foo' }
end
class Dar < Foo
Bar.new
Car.new
end
#file_root.rb
require './file1'
require './file2'
仅供参考,您可能已经发现我正在使用来自'get'方法的Sinatra。因此file_root.rb
文件实际上是config.ru
。