2011-10-19 20 views
35

Así Module se puede utilizar en Ruby para proporcionar los espacios de nombre, además de mixins, así como:¿Cuál es la diferencia entre estas convenciones de espacios de nombres de Ruby?

module SomeNamespace 
    class Animal 

    end 
end 

animal = SomeNamespace::Animal.new 

Pero también he visto los siguientes utilizarse:

module SomeNamespace 
end 

class SomeNamespace::Animal 

end 

animal = SomeNamespace::Animal.new 

Mi pregunta es cómo' Re diferente (si lo son) y cuál es más idiomático Ruby?

Respuesta

37

La diferencia radica en anidar.

En el ejemplo siguiente, puede ver que el método anterior que usa la clase Foo, puede obtener las variables constantes BAR_A del alcance externo sin errores.

Mientras tanto, la clase Baz bombardeará con un error de constante no inicializada A :: B :: Baz :: BAR_A. Como no trae A :: * implícitamente, solo A :: B :: * explícitamente.

module A 
    BAR_A = 'Bar A!' 
    module B 
    BAR_B = 'Bar B!' 
     class Foo 
     p BAR_A 
     p BAR_B 
     end 
    end 
end 

class A::B::Baz 
    p BAR_A 
    p BAR_B 
end 

Ambos comportamientos tienen su lugar. No existe un consenso real en la comunidad en mi opinión sobre cuál es el One True Ruby Way (tm). Yo personalmente uso el primero, la mayor parte del tiempo.

5

La única diferencia entre los dos enfoques es que el segundo arrojará uninitialized constant Object::SomeNamespace si el espacio de nombre no se ha declarado previamente.

Cuando se declare en un solo archivo, optaría por el primero porque no tiene que repetir SomeNamespace.

Al utilizar varios archivos También uso la segunda, para evitar encontrarse con el siguiente problema:

# in a.rb 
require 'b' 

module SomeNamespace 
    def self.animal 
    Animal.new 
    end 
end 

# in b.rb 
class SomeNamespace::Animal 

end 

# irb 
require 'a' # explodes with the uninitialized constant error 

Este ejemplo puede ser inventado, pero es fácil de accionar que si su base de código es un poco más grande. Usualmente uso la forma explícita (la primera) para evitar esto.

Una cosa que puede ser útil al usar el segundo formulario es que detectará los errores tipográficos en el espacio de nombres.

No parece que exista una forma establecida de crear espacios de nombres. Idee, por ejemplo, mezcla ambos enfoques: first one, second one.

Cuestiones relacionadas