Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Ruby Diary #17: Giocare con i namespace in Ruby

Classi e Moduli possono essere usati per creare Namespace in Ruby, ma attenzione alle priorità dell'interprete!
Classi e Moduli possono essere usati per creare Namespace in Ruby, ma attenzione alle priorità dell'interprete!
Link copiato negli appunti

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.

Ti consigliamo anche