irbで以下のファイルをロード/ロードすると、john
は未定義の変数ですが、Person
が存在するのはなぜですか?私はその後Person
とjohn
の両方にアクセスする必要はありませんので、irbセッションでファイルを実行するだけですか?なぜローカル変数をロードしないでirbでロード/要求するのですか?
somefile.rb
class Person
end
john = Person.new
irbで以下のファイルをロード/ロードすると、john
は未定義の変数ですが、Person
が存在するのはなぜですか?私はその後Person
とjohn
の両方にアクセスする必要はありませんので、irbセッションでファイルを実行するだけですか?なぜローカル変数をロードしないでirbでロード/要求するのですか?
somefile.rb
class Person
end
john = Person.new
/負荷がちょうどIRBにファイルをコピーして貼り付けると同じではありませんが必要です。あなたはファイルを実行しますが、ファイルはルビで独自のスコープを持ちます。作成するローカル変数john
は、そのファイルにスコープされます。つまり、ファイルを定義すると、ファイル内では使用できますが、ファイル外では使用できません。これは良い機能です:Dog
クラスを作成し、を割り当てる別のファイルがあるとします。そのファイルをロードすると、最初のファイルにjohn
の割り当てが変更され、john
に依存するコードがすべて破棄されます。多くのRubyプログラムには何百ものファイルが含まれています。これがどのように苦痛になるか想像できます。あなたは私たちは、変数を定義し、我々はそれらを変更します呼び出す他のコードを気にせず、彼らと物事を行うことができるようにしたい二つの方法
def method1
john = Dog.new
end
def method2
john = Person.new
method1()
puts john
end
を持っているとき、それは同じことです。 method2を呼び出すと、john
はまだPerson
であることがわかります。他のメソッドを呼び出すことでローカル変数が変更された場合、何が起きているのかを判断することは非常に難しいでしょう。
ファイル内のローカル変数は、メソッド内のローカル変数と同様に、それらのメソッドにのみスコープが設定されているようなスコープになります。ファイルの外側にアクセスしたい場合は、それらを定数にしてください。
JOHN = Person.new
ありがとうございました! 'class'はどのようにファイルにスコープされていませんか? – stackjlei
'class'は定数を与えなければならないキーワードです。あなたが 'class person;あなたは構文エラーを取得します。ルビ定数では、大文字で始まる識別子です。 'person'は変数です' Person'は定数です。定数は、ローカル変数とは異なる字句範囲を持ちます。それらは、定義されているモジュールから任意のサブモジュールにアクセスできます。彼らがあなたの例のようにモジュールの外で定義されている場合、それらはグローバルに利用可能です。 –