2011-08-03 12 views

Respuesta

8

Si utiliza class Foo::Bar, pero el módulo Foo no se ha definido todavía, una excepción serán levantados, mientras que el método module Foo; class Bar definirá Foo si no se ha definido todavía.

Además, con el formato de bloque, se podría definir múltiples clases dentro:

module Foo 
    class Bar; end 
    class Baz; end 
end 
+2

También si 'foo' se definió como una la clase 'Foo :: Bar' no generará la excepción mientras' módulo Foo; end' levantará un 'TypeError' ya que' Foo' no es un módulo sino una clase. – robertodecurnex

6

Observe también esta curiosa poco de Rubí-ismness:

FOO = 123 

module Foo 
    FOO = 555 
end 

module Foo 
    class Bar 
    def baz 
     puts FOO 
    end 
    end 
end 

class Foo::Bar 
    def glorf 
    puts FOO 
    end 
end 

puts Foo::Bar.new.baz # -> 555 
puts Foo::Bar.new.glorf # -> 123 
+0

¿Puedes darnos alguna explicación de por qué está sucediendo esto en tu ejemplo? Creo que la segunda llamada también devolvería 555. – wmock

+0

@WillsonMock Buena pregunta. Casi me gustaría abrir una nueva pregunta SO para esto. Encontré la respuesta cuando escribí esto, pero ahora ya no la recuerdo y no puedo encontrarla nuevamente. Debería haber publicado en la respuesta aquí también: -/Pasa con las clases también por cierto. no solo módulos – Casper

+2

genial, en caso de que quiera seguir, esta es la nueva pregunta de SO que he publicado: http://stackoverflow.com/questions/15119724/ruby-lexical-scope-vs-inheritance – wmock

Cuestiones relacionadas