Doppi punti di Ruby (: :) differenze di utilizzo dell’operatore

C’è qualche differenza tra

module Foo class Engine < Rails::Engine end end 

e

 module Foo class Engine < ::Rails::Engine end end 

Le costanti in Ruby sono nidificate come file e directory nel filesystem. Quindi, le costanti sono identificate in modo univoco dai loro percorsi.

Per disegnare un’analogia con il file system:

 ::Rails::Engine #is an absolute path to the constant. # like /Rails/Engine in FS. Rails::Engine #is a path relative to the current tree level. # like ./Rails/Engine in FS. 

Ecco l’illustrazione del ansible errore:

 module Foo # We may not know about this in real big apps module Rails class Engine end end class Engine1 < Rails::Engine end class Engine2 < ::Rails::Engine end end Foo::Engine1.superclass => Foo::Rails::Engine # not what we want Foo::Engine2.superclass => Rails::Engine # correct 
 Rails::Engine #is a path relative to the current tree level. # like ./Rails/Engine in FS. 

Questo non è del tutto vero!

Facciamo un esempio:

 module M Y = 1 class M Y = 2 class M Y = 3 end class C Y = 4 puts M::Y end end end # => 3 module M Y = 1 class M Y = 2 class C Y = 4 puts M::Y end end end # => 2 module M Y = 1 class M Y = 2 class M Y = 4 puts M::Y end end end # => 4 

Quindi quando dici che M: Y ruby ​​cerca la definizione più vicina, non importa se è all’interno dell’ambito corrente o dell’ambito esterno o dello scope esterno esterno ecc.