Mi pregunta es similar a " ¿Cuál es la diferencia entre incluir y extender en Ruby? ".
¿Cuál es la diferencia entre require
y include
en Ruby? Si solo quiero usar los métodos de un módulo en mi clase, ¿debería require
hacerlo o include
no?
Mi pregunta es similar a " ¿Cuál es la diferencia entre incluir y extender en Ruby? ".
¿Cuál es la diferencia entre require
y include
en Ruby? Si solo quiero usar los métodos de un módulo en mi clase, ¿debería require
hacerlo o include
no?
require
yinclude
, y también relevantes,Module#append_features
.Respuestas:
Fuente
Entonces, si solo desea usar un módulo, en lugar de extenderlo o hacer una mezcla, entonces querrá usarlo
require
.Por extraño que parezca, Ruby's
require
es análogo a C'sinclude
, mientras que Ruby'sinclude
no se parece en nada a C'sinclude
.fuente
include
en Ruby es simplemente herencia.class C; include M end
haceM
la superclase deC
y la (antigua) superclase deC
la superclase deM
. No creo que Cinclude
funcione a través de la herencia, creo que es una simple sustitución textual / léxica.Si está utilizando un módulo, eso significa que está incorporando todos los métodos a su clase. Si tiene
extend
una clase con un módulo, eso significa que está "incorporando" los métodos del módulo como métodos de clase . Si tieneinclude
una clase con un módulo, eso significa que está "incorporando" los métodos del módulo como métodos de instancia .EX:
B.say
=> método indefinido 'decir' para B: ClaseB.new.say
=> este es el módulo AC.say
=> este es el módulo AC.new.say
=> método indefinido 'decir' para C: Clasefuente
require
yinclude
.Del libro Metaprogramming Ruby,
fuente
Ruby
require
es más como "incluir" en otros lenguajes (como C). Le dice a Ruby que desea traer el contenido de otro archivo . Mecanismos similares en otros idiomas son:using <namespace>
directiva en C # .import <package>
en Java .Ruby
include
es un mecanismo de herencia orientado a objetos utilizado para mixins .Hay una buena explicación aquí :
Énfasis añadido.
fuente
¿Alguna vez has intentado con
require
un módulo? ¿Cuáles fueron los resultados? Sólo inténtalo:No se pueden requerir módulos, ¡solo se incluyen!
fuente
TypeError
) si la palabraModule
se cambia aClass
.Desde la programación de Ruby 1.9
fuente
Incluir Cuando incluye un módulo en su clase como se muestra a continuación, es como si tomara el código definido dentro del módulo y lo insertara dentro de la clase, donde lo 'incluye'. Permite el comportamiento 'mixin'. Se utiliza para SECAR su código para evitar la duplicación, por ejemplo, si hubiera varias clases que necesitarían el mismo código dentro del módulo.
Carga El método de carga es casi como el método requerido, excepto que no realiza un seguimiento de si esa biblioteca se ha cargado o no. Por lo tanto, es posible cargar una biblioteca varias veces y también cuando se utiliza el método de carga debe especificar la extensión ".rb" del nombre del archivo de la biblioteca.
Requerir El método require le permite cargar una biblioteca y evita que se cargue más de una vez. El método require devolverá 'false' si intenta cargar la misma biblioteca después de la primera vez. El método require solo debe usarse si la biblioteca que está cargando se define en un archivo separado, que suele ser el caso.
Puede preferir esto http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/
fuente
A continuación se presentan algunas diferencias básicas entre requerir e incluir:
Exigir:
Incluir:
fuente
Volverá bolean verdadero / falso
El nombre que se pasa como parámetro al requisito, ruby intentará encontrar el archivo fuente con ese nombre en su ruta de carga. El método require devolverá 'false' si intenta cargar la misma biblioteca después de la primera vez. El método require solo debe usarse si la biblioteca que está cargando está definida en un archivo separado. Por lo tanto, realiza un seguimiento de si esa biblioteca ya estaba cargada o no.
Supongamos que tiene algunos métodos que necesita tener en dos clases diferentes. Entonces no tienes que escribirlos en ambas clases. En cambio, lo que puede hacer es definirlo en el módulo. Y luego incluya este módulo en otras clases. Ruby lo proporciona solo para garantizar el principio DRY. Se utiliza para SECAR su código para evitar duplicaciones
fuente
Incluir
Exigir
Por lo tanto, realiza un seguimiento de si esa biblioteca ya estaba cargada o no. Tampoco necesita especificar la extensión ".rb" del nombre del archivo de la biblioteca. Aquí hay un ejemplo de cómo usar require. Coloque el método require en la parte superior de su archivo ".rb":
Carga
Ampliar
fuente
'Cargar': inserta el contenido de un archivo. (Analiza el archivo cada vez que se llama al archivo)
'Requerir': inserta un contenido analizado del archivo (archivo analizado una vez y almacenado en la memoria)
'Incluir': incluye el módulo en la clase y puede usar métodos dentro del módulo como método de instancia de la clase
'Extender': incluye el módulo en la clase y puede usar métodos dentro del módulo como método de clase
fuente