带类继承的未初始化常量错误
显然,我在ruby中的理解方式有些问题。我有3个红宝石文件主,基地,并派生。我有两个班Derived
专门从Base
。带类继承的未初始化常量错误
/bin/main.rb
require './lib/base'
/lib/base.rb
require './lib/derived'
class Base
end
/lib/derived.rb
require './lib/base'
class Derived < Base
end
与耙运行ruby './bin/main.rb'
`<top (required)>': uninitialized constant Base (NameError)
什么是造成错误?
编辑: 我刚刚意识到我缺少的一点是我忘了require
是一个内核#方法,我不需要像我通常对其他语言一样每次都保持在我的代码之上。
这里的问题是,需要'./lib/derived'
在/lib/base.rb
文件实际上是造成/lib/derived.rb
之前Base
在/lib/base.rb
被宣告解析。试试这个,而是:
/bin/main.rb
require './lib/base'
require './lib/derived'
puts 'Success!'
/lib/base.rb
class Base
end
/lib/derived.rb
require './lib/base'
class Derived < Base
end
这使得声明以正确的顺序发生。
作为一个侧面说明,它不是在技术上lib/main.rb
必要require './lib/base'
,因为它实际上是成功列入lib/derived.rb
,但如果Base
中的lib/main.rb
体内直接使用的好形式。
谢谢,现在它是有道理的,虽然我希望只需要基类中的子类使它像一个工厂一样,隐藏客户端的子类细节(main.rb)。 –
你可以通过几种不同的方式来实现。首先,您可以使用加载程序文件来要求您的项目的所有依赖项,这是大多数框架完成的工作。在这个简单的例子中,你可以合理地跳过''lib/derived.rb''文件,并在''lib/base.rb''中声明'Base'和'Derived'类,更像一个库做到这一点。如果你必须有单独的源文件,在你完成“Base”声明之后,只需要从'lib/base.rb''的底部''lib/derived.rb''。 –
您正在从'base'的'derived'和'derived'需要'base'。这是一个无限循环。 –
@Petr,我知道这个错误就是这样,谢谢你的确认。 –