1

eclipse、DLTK ruby​​ プラグイン、および Ruby 2.0 を使用して、Ruby を初めて使用しています。次のコードを含む AModule.rb という Ruby モジュール ファイルを作成しました。

module AModule
  aConstant = 7
end

これは、同じプロジェクト内のテスト Ruby スクリプトから呼び出されます。

require 'AModule'
puts AModule::aConstant

上記のコードの 2 行目で、エラーが発生しますin '<main>': undefined local variable or method 'aModule' for main:Object (NameError)

コードアカデミーのチュートリアルに従ったので、これが起こるとは思っていませんでした。ここで私が犯している間違いは何ですか?

PS: 実は、私は自分のモジュールファイルに **AM**odule.rb ではなく **aM**odule.rb という名前を付けたかったのです。しかし、DLTK プラグインは静かに最初のアルファベットを大文字にします。これはバグでしょうか?

4

2 に答える 2

1

あなたの問題は、定数の名前が UpperCaseLetter で始まる必要があることです。そうしないと、Ruby はそれをローカル変数と見なします。それで、それの何が問題なのですか?簡単な答え: それはすべてスコープに関するものです。ローカル変数は、レキシカル スコープでのみ表示されます。定数はまったく別のものです。定数は、いわゆる名前空間解決演算子 ( ::)を介して常にアクセスできます。

Ruby スコープの詳細については、こちらを参照してください。

于 2014-09-21T09:53:37.593 に答える
0

Eclipse IDE の代わりに Windows コマンドを使用しました。コードのエラーを見つけて最終的に修正するために使用した手順を示します。ここでは、DLTK プラグインに問題はありません。モジュール ファイルとテスト スクリプトは同じフォルダーにあります。

教訓 -モジュール内のモジュール名と定数名は大文字で始めなければなりません。なぜ、私は知りません。

aModule.rb

module aModule
aConstant = 7
end

Test.rb

require 'aModule'
puts aModule::aConstant

cmd: Test.rb フォルダーに cd し、ruby Test.rb エラー: ``require': そのようなファイルを読み込めません -- tokenizer.rb (LoadError)` help: Ruby 'require' エラー: そのようなファイルを読み込めません

Ruby 1.9 では現在のディレクトリがロード パスから削除されているため、Pascal が言うように、このファイルに対して相対要求を実行する必要があります。

require './tokenizer'

.rb を接尾辞として付ける必要はありません。Ruby は、とにかくそれが意味することを理解できるほど賢いからです。

次の変更を加えました。

Test.rb

require './aModule'
puts aModule::aConstant

cmd: ruby Test.rb エラー: class/module name must be CONSTANT (SyntaxError) aModule.rb ヘルプ: Ruby の NameError

次の変更を加えました。

aModule.rb

module AModule # capital
aConstant = 7
end

Test.rb

require './AModule'
puts AModule::aConstant

cmd: ruby​​ Test.rb エラー: undefined method 'aConstant' for AModule:Module (NoMethodError) ヘルプ:上記のリンクを使用しました。定数も大文字で名前を付ける必要があると思います。

最終的な作業コード:

aModule.rb

module AModule # capital
AConstant = 7 # capital
end

Test.rb

require './AModule'
puts AModule::AConstant

え、Rubyってこんなもんなの???./そして、モジュール名がテストスクリプトと同じフォルダーにあるのに、なぜモジュール名の前に追加する必要があるのでしょうか?

于 2014-09-21T08:14:05.070 に答える