Sie können module Something
, jedes Auftreten von class Something
oder def something
als „Gateway“ in einen neuen Bereich denken gefunden. Wenn Ruby nach der Definition eines Namens sucht, auf den verwiesen wurde, sucht er zuerst im aktuellen Bereich (der Methode, der Klasse oder des Moduls), und wenn er dort nicht gefunden wird, wird er durch jeden mit "Gateway" und Suche zurückgehen der Umfang dort.
In Ihrem Beispiel das Verfahren baz
ist definiert als
module Foo
class Bar
def baz
puts FOO
end
end
end
Also, wenn der Wert von FOO
zu bestimmen versucht, zuerst die Klasse Bar
wird geprüft, und da Bar
enthält keine FOO
die Suche nach oben bewegt über das "class Bar
Gateway" in das Modul Foo
, das den enthaltenen Bereich enthält. Foo
enthält eine Konstante FOO
(555), also ist dies das Ergebnis, das Sie sehen.
Verfahren glorf
ist definiert als:
class Foo::Bar
def glorf
puts FOO
end
end
Hier wird das „Gateway“ class Foo::Bar
ist, so dass, wenn nicht innerhalb FOO
Bar
gefunden wird das „Tor“ durchläuft das Modul Foo
und gerade in der obersten Ebene , wo es eine andere FOO
(123) gibt, was angezeigt wird.
Hinweis, wie class Foo::Bar
Verwendung erzeugt ein einzelnes „Gateway“, über den Umfang der Foo
Skipping, aber module Foo; class Bar ...
öffnet zwei separate „Gateways“
Willson, zugeordnet, die unten beantworten denken Sie, würdig der Prämie ist? Danke – rainkinz
Hinweis: fügen Sie "puts Module.nesting" nach den beiden puts in Ihrem Code. Siehe auch: http://coderrr.wordpress.com/2008/03/11/constant-name-resolution-in-ruby/ –