2016-04-29 10 views
2

明らかに、私がそれをどのようにして、ルビーで理解しているかが分かります。私は3つのルビファイルをメイン、ベース、および派生しています。私は2つのクラスを持っていますDerivedBaseから特化しています。レーキで実行クラス継承による初期化されていない定数のエラー

/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

あなたは 'derived'の' base'と 'base'の' derived'を必要としています。それは無限ループです。 –

+0

@ Petr、私は間違いがどういうわけかそれらの行に沿って何かを知っていた、それを確認していただきありがとうございます。 –

答えて

2

問題が/lib/base.rbファイルに必要'./lib/derived'が実際にBase/lib/base.rbの中で宣言される前に、/lib/derived.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/derived.rbに含まれているので、それは、技術的にlib/main.rbrequire './lib/base'に必要ではないが、Baselib/main.rbの身体に直接使用されている場合、それは良い形です。

+0

私はファクトリーのように動作させるために、サブクラスを基本クラスでのみ要求していましたが、クライアント(main.rb)からサブクラスの詳細を隠すことを望んでいました。 –

+0

これは、いくつかの異なる方法で行うことができます。まず、ローダーファイルを使用してプロジェクトのすべての依存関係を要求することができます。これはほとんどのフレームワークがどのようにそれを行うのかです。この単純な例では、 '' lib/derived.rb''ファイルをスキップして、 '' lib/base.rb ''に 'Base'クラスと' Derived'クラスを宣言することができます。それをやる。別のソースファイルを用意する必要がある場合は、 '' Base''の宣言を完了した後で '' lib/base.rb ''の底から' 'lib/derived.rb' 'を要求するだけです。 –

関連する問題