は、次のコードを考えるとアクセスしたときに癖は親のクラスメソッドは、サブクラスの定数
puts Parent.do_the_thing
# Parent
# Parent
puts Child.do_the_thing
# Parent
# Child
しないのはなぜChild.do_the_thing
印刷「子」二回?
は、次のコードを考えるとアクセスしたときに癖は親のクラスメソッドは、サブクラスの定数
puts Parent.do_the_thing
# Parent
# Parent
puts Child.do_the_thing
# Parent
# Child
しないのはなぜChild.do_the_thing
印刷「子」二回?
一定の検索アルゴリズムは、に簡略化することができる:だから継承
によって字句「外側」
matzがこのアルゴリズムの正式な正当性を提供したことはありませんでしたが、このアルゴリズムはNewspeakのメソッド解決アルゴリズムに似ています.Gilad Brachaは以下の正当性を示しました。あなたの目の前で値がの字句的に囲んでいる文脈でを持っていれば、それがシステムのまったく異なる部分から他の値を選んだのは驚くべきことです。
CONSTANT
代入は文字通りメソッド定義のすぐ上にありますが、目の前に割り当てられている値を受け取っていない場合は、そのメソッドの作成者にとって驚くことでしょう。
self::CONSTANT
の場合は、::
スコープ解決演算子を使用して、ルックアップの開始点を明示的に指定して字句検索部分をスキップします。
注:残念ながら、一定の検索はではなく、実際には単純です。悲しいことに、私はそれの良い記述を知らない。彼女の有名な"Three Implicit Contexts"の記事では、yuguiは時間がなくなり、後の記事で一定の検索を説明すると書いたが、残念ながら、彼女は決してしなかった。
あなたはChild
クラスにdo_the_thing
メソッドを呼び出すと、self
はChild
ので、self::CONSTANT
はChild::CONSTANT
( '子')です。
あなたはParent
クラスにdo_the_thing
メソッドを呼び出すと、self
はParent
ので、self::CONSTANT
はParent::CONSTANT
( '親')です。あなただけのCONSTANT
を呼び出すとき
しかし、Rubyはまずdo_the_thing
方法が配置されている場所で、この定数を見つけようと、それは両方のケースのためにParent
クラスです。