可視性の球、家の部屋のような
変数について話したとき、最も一般的なタイプの変数は”ローカル変数”であると述べました。 何のために地元ですか? どこ? 私たちは最終的にそれをもっと説明する準備ができています。メソッドについて話してきたので、別のimportantconcept:scopesについても議論することができます。
Wikipediaは言う:”プログラミングでは、名前の範囲は、名前が有効であるプログラムの一部です:名前はsomethingelseを参照するために使用することができます。”(私たち自身の用語と一致するように少し変更されました)
名前は特定のスコープでは既知(または定義)であり、このスコープ外では未知(または未定義)です。球、バブル、または部屋(nowindows、およびドアが閉じている)のスコープについて考えることができます:変数名のような特定の名前は、部屋の中で”既知”で”可視”です。 他の部屋で知られていて目に見える他の名前は、この部屋では知られていませんが、他の部屋でのみ知られています。
メソッド呼び出しがあり、実行の流れがthemethodの本体に入るたびに、新しいスコープ、つまり”room”に入ります。 このメソッドのスコープに対して”ローカル”なもの(つまり、部屋の”内部”にあるもの)は、このスコープでのみ可視です。 その外では、彼らは知られていません。
未定義のローカル変数またはメソッド
これはまた、最も頻繁に表示されるエラーメッセージについて話す良い機会です。 たとえば、変数名やメソッド名のスペルミスやタイプミスをしたときに毎回表示されます。
このコードを考えてみましょう:p>
def add_two(number) number + 2endputs add_two(3)puts number
行puts add_two(2)
5
puts number
willthenエラーが発生します。これは、メソッドがローカル変数である場合、番号3
number
ためです。 これは、メソッドのスコープに対してローカルです。 これは、実行の流れがメソッドに入るときに作成されます。
このスコープ外では、メソッドから実行フローが返されると、メソッドのスコープが破棄され、すべてのローカル変数がなくなります。 したがって、ローカル変数number
は知られておらず、Rubyはundefined local variable or method 'number'
というエラーを発生させます。このエラーメッセージについて少し考えてみると、それは意味がありますか?
Rubyでは、ローカル変数名とメソッド名の両方が同じ方法で書かれているという事実を黙ってスキップしました。たとえば、次のようにします。
number = 2puts number
number
puts number
の行で使用されます。
しかし、ここでは、
:p>
def number 2endputs number
number
puts number
これは、Rubyがプログラムを実行するときに、別の文の後に一つの文 そして、ような普通の単語に遭遇すると、現在のスコープ内で、samenameを持つローカル変数を知っているかどうかを最初に確認します。 その場合、この変数に関連付けられている値が使用されます。 この名前のローカル変数がない場合は、メソッドを探します。 この名前のメソッドもない場合は、エラーメッセージundefined local variable or method 'number'
が表示されます。
エラーメッセージはかなり正確ですが、複雑に聞こえることもあります。 あなたはここで”数字”という言葉を使用しましたが、私はそれを知りません(この範囲では)。 あなたはローカル変数を使用することを意味しましたか? または方法?それは理にかなっていますか?
ローカルスコープのトピックに戻ります。 別の例を見てみましょう:
number = 1def add_to(number) number + 2endputs add_to(3)
出力はどうなると思いますか? それは3
5
5
であることがわかります。
その理由は、外側のスコープの番号1
をavariablenumber
puts add_to(3)
puts add_to(3)
puts add_to(3)
number
。
代わりに、制御フローがメソッドに入るとadd_to
Rubyは新しいローカルスコープを作成し、メソッドに渡された番号3
number
number
はメソッドのスコープに対してローカルであるため、これは外側のスコープの最初の行のものとは異なる変数です。
Rubyがメソッドに入るとき、それは彼女が家の光沢のある新しい部屋に入るようなものです。 彼女と一緒に、彼女は引数として渡されたオブジェクトをthemethod呼び出しにもたらします。 上記の例では、彼女は番号3
であるオブジェクトをもたらします。
今、Rubyがメソッドに入るとすぐに、彼女はメソッド定義の引数リストに従って、オブジェクトにポストイットメモを貼り付けます。 Ourexampleでは、それは名前number
です。 だから今から、この部屋には、値が割り当てられているaknownローカル変数があります:オブジェクト(number)3
number
その上に。
この例では、外側のスコープとメソッドのスコープadd_two
、aretwo異なる部屋、およびちょうどそれらに同じ名前を持っていることが起こる