2016-04-29 69 views
2

显然,我在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是一个内核#方法,我不需要像我通常对其他语言一样每次都保持在我的代码之上。

+1

您正在从'base'的'derived'和'derived'需要'base'。这是一个无限循环。 –

+0

@Petr,我知道这个错误就是这样,谢谢你的确认。 –

回答

2

这里的问题是,需要'./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体内直接使用的好形式。

+0

谢谢,现在它是有道理的,虽然我希望只需要基类中的子类使它像一个工厂一样,隐藏客户端的子类细节(main.rb)。 –

+0

你可以通过几种不同的方式来实现。首先,您可以使用加载程序文件来要求您的项目的所有依赖项,这是大多数框架完成的工作。在这个简单的例子中,你可以合理地跳过''lib/derived.rb''文件,并在''lib/base.rb''中声明'Base'和'Derived'类,更像一个库做到这一点。如果你必须有单独的源文件,在你完成“Base”声明之后,只需要从'lib/base.rb''的底部''lib/derived.rb''。 –