2017-07-15 2 views

答えて

2

/負荷がちょうど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 
+1

ありがとうございました! 'class'はどのようにファイルにスコープされていませんか? – stackjlei

+1

'class'は定数を与えなければならないキーワードです。あなたが 'class person;あなたは構文エラーを取得します。ルビ定数では、大文字で始まる識別子です。 'person'は変数です' Person'は定数です。定数は、ローカル変数とは異なる字句範囲を持ちます。それらは、定義されているモジュールから任意のサブモジュールにアクセスできます。彼らがあなたの例のようにモジュールの外で定義されている場合、それらはグローバルに利用可能です。 –

関連する問題