Ruby, come altri linguaggi di programmazione, supporta i Namespace. Possiamo creare dei namespace annidando una dichiarazione di una classe/modulo all'interno di un'altra classe/modulo.
Ad esempio:
module Net class MyClass # end end
Potremo così istanziare un nuovo oggetto via Net::MyClass
.
Attenzione però, con molta probabilità questo script restituirà un errore.
class Net class MyClass # end end
Il motivo è semplice. Net
esiste già in Ruby, è uno dei moduli core che contiene librerie dedicate alla rete ed ai suoi protocolli. Potete tranquillamente usarlo ma ricordate che è un modulo dunque si arrabbierà se tenterete di chiamarlo come classe!
Quando comincerete a programmare librerie complesse uno dei dubbi potrebbe essere relativo a quale metodo usare per richiamare classi/moduli sotto namespace.
Ad esempio, nella vostra libreria MyClass
sotto Net
potete scegliere di istanziare un nuovo oggetto Net::HTTP
sia con Net::HTTP.new
sia HTTP.new
. Il motivo è che vi trovate già nel namespace dunque avete diverse opportunità .
Quale usare? Non ho ancora trovato una risposta reale a questa domanda, sembra che anche tra i grandi programmatori Ruby ognuno agisca un po' come gli viene meglio. Per aiutarvi a chiarire le varie "precedenze" dell'interprete Ruby ho realizzato un minuscolo script.
module Wrapper class Test def initialize puts "Wrapper::Test" end end class Inner def initialize puts Test.new() puts Wrapper::Test.new() puts Outer::Test.new() puts ::Test.new() end class Test def initialize puts "Wrapper::Inner::Test" end end end class Outer def initialize puts Test.new() puts ::Test.new() end class Test def initialize puts "Wrapper::Outer::Test" end end end end class Test def initialize puts "Test" end end x = Wrapper::Inner.new()
Provate ad eseguirlo e giocate un po' con le definizioni. Vedrete direttamente voi stessi cosa succede e come si comporta l'interprete Ruby.