2009-06-26 11 views
32

Por un tiempo había incluido una clase completa dentro de un módulo de Ruby. Aparentemente esto no es lo que se supone que debo hacer. Parece que el objetivo de un módulo es almacenar funciones que luego se pueden incluir como métodos en una nueva clase.Incluyendo una clase de Ruby de un archivo separado

No quiero esto. Tengo una clase que quiero mantener en un archivo separado al que puedo acceder desde otros archivos. ¿Cómo puedo hacer esto?

Gracias.

+0

Esta publicación aclara la expresión require_relative en caso de que tenga problemas con el ejemplo anterior cuando en Ruby> = 1.9.2 [Ruby require_relative example] (http://stackoverflow.com/questions/3672586/what-is -require-relative-in-ruby) – Dirk

Respuesta

55

Los módulos tienen un doble propósito como soporte para funciones y como espacio de nombres. Mantener clases en módulos es perfectamente aceptable. Para poner una clase en un archivo separado, simplemente defina la clase como de costumbre y luego en el archivo donde desea usar la clase, simplemente ponga require 'name_of_file_with_class' en la parte superior. Por ejemplo, si definí la clase Foo en foo.rb, en bar.rb tendría la línea require 'foo'.

Si está utilizando rieles, esto sucede a menudo incluyen automagicamente

Editar: clarificación de la estructura del archivo

#file: foo.rb 
class Foo 
    def initialize 
    puts "foo" 
    end 
end 

...

#file: bar.rb 
require 'foo' 

Foo.new 

Si se encuentra en los carriles, puso éstos las clases en lib/ y usan la convención de nomenclatura para los archivos de la versión de subrayado en minúsculas del nombre de la clase, por ejemplo Foo ->foo.rb, FooBar ->foo_bar.rb, etc.

A partir de la versión 1.9 de rubí puede utilizar require_relative, para requerir archivos relativamente al archivo que se está editando.

+0

gracias, muy útil. ¿Podrías aclarar esa última oración? parece que has tenido un error tipográfico (?). Si la clase foo se almacena en bar.rb, necesito 'foo' en bazcontroller.rb? Entonces foo.new se puede usar en bazcontroller.rb? – user94154

+9

Quizás sería bueno agregar algo de información sobre 'require_relative' para Ruby 1.9 ya que el código no funciona para esta versión. – boutta

+2

@boutta Gracias por la aclaración de 1.9, esto solucionó mi problema. – DorkRawk

Cuestiones relacionadas