Ruby Diary #17: Giocare con i namespace in Ruby

Giovedì 6 Dicembre 2007 - 08:21

di Simone Carletti

Ruby

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.

Tags:

Categoria: Ruby | Permalink

Non ci sono ancora commenti a questo post

Inserisci il tuo commento:





(puoi usare i seguenti tag HTML per formattare il testo -
a href, b, i, br/, p, strong, em, ul, ol, li, blockquote, pre):

 

Anteprima del commento