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.
Se vuoi aggiornamenti su Ruby inserisci la tua email nel box qui sotto: