¿Cuál es la diferencia entre incluir y requerir en Ruby?
include require (10)
¿Cuál es la diferencia entre "incluir" y "requerir" en Ruby?
Responder:
Los métodos de inclusión y requerimiento hacen cosas muy diferentes.
El método require hace lo que include en la mayoría de los otros lenguajes de programación: ejecuta otro archivo. También hace un seguimiento de lo que ha requerido en el pasado y no requerirá el mismo archivo dos veces. Para ejecutar otro archivo sin esta funcionalidad adicional, puede utilizar el método de carga.
El método de inclusión toma todos los métodos de otro módulo y los incluye en el módulo actual. Esto es una cosa de nivel de lenguaje en lugar de una cosa de nivel de archivo como con require. El método de inclusión es la forma principal de "extender" las clases con otros módulos (generalmente denominados mezclas). Por ejemplo, si su clase define el método "cada", puede incluir el módulo de mezcla Enumerable y puede actuar como una colección. Esto puede ser confuso ya que el verbo de inclusión se usa de manera muy diferente en otros idiomas.
Entonces, si solo quiere usar un módulo, en lugar de extenderlo o hacer una mezcla, entonces querrá usar require
.
Por extraño que parezca, el require
de Ruby es análogo al de C, mientras que el de Ruby es casi nada como el de C.
Mi pregunta es similar a " ¿Cuál es la diferencia entre incluir y extender en Ruby? ".
¿Cuál es la diferencia entre require
e include
en Ruby? Si solo quiero usar los métodos de un módulo de mi clase, ¿debo require
o include
?
¿Alguna vez has tratado de require
un módulo? ¿Cuáles fueron los resultados? Sólo inténtalo:
MyModule = Module.new
require MyModule # see what happens
Los módulos no pueden ser requeridos, solo incluidos!
A continuación se presentan algunas diferencias básicas entre requieren e incluyen:
Exigir:
- Require lee el archivo desde el sistema de archivos, lo analiza, lo guarda en la memoria y lo ejecuta en un lugar determinado, lo que significa que incluso si cambia algo mientras se ejecuta el script, ese cambio no se reflejará.
- Requerimos archivo por nombre, no por nombre de módulo.
- Normalmente se utiliza para bibliotecas y extensiones.
Incluir:
- Cuando incluye un módulo en su clase, se comporta como si tomara el código definido en su módulo y lo insertara en su clase.
- Incluimos el nombre del módulo, no el nombre del archivo.
- Normalmente se utiliza para secar el código y eliminar la duplicación en el código.
De Programación Ruby 1.9
Vamos a hacer un par de puntos sobre la declaración de inclusión antes de continuar. Primero, no tiene nada que ver con los archivos. Los programadores de C usan una directiva de preprocesador llamada #include para insertar el contenido de un archivo en otro durante la compilación. La declaración de inclusión de Ruby simplemente hace una referencia a un módulo. Si ese módulo está en un archivo separado, debe usar require (o su primo, carga menos utilizada) para arrastrar ese archivo antes de usar include. En segundo lugar, una inclusión de Ruby no simplemente copia los métodos de instancia del módulo en la clase. En su lugar, hace una referencia de la clase al módulo incluido. Si varias clases incluyen ese módulo, todas apuntarán a la misma cosa. Si cambia la definición de un método dentro de un módulo, incluso mientras su programa se está ejecutando, todas las clases que incluyan ese módulo exhibirán el nuevo comportamiento.
Del libro Metaprogramming Ruby,
El método
require()
es bastante similar aload()
, pero tiene un propósito diferente. Utilizaload()
para ejecutar código, yrequire()
para importar bibliotecas.
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 DRY up 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, al utilizar 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 requerido devolverá ''falso'' si intenta cargar la misma biblioteca después de la primera vez. El método requerido solo debe usarse si la biblioteca que está cargando se define en un archivo separado, lo que suele ser el caso.
Puede preferir este http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/
Si está utilizando un módulo, eso significa que está incorporando todos los métodos a su clase. Si extend
una clase con un módulo, eso significa que está "incorporando" los métodos del módulo como métodos de clase . Si include
una clase con un módulo, eso significa que está "incorporando" los métodos del módulo como métodos de instancia .
EX:
module A
def say
puts "this is module A"
end
end
class B
include A
end
class C
extend A
end
B.say
=> método indefinido ''say'' para B: Class
B.new.say
=> este es el módulo A
C.say
=> este es el módulo A
C.new.say
=> método indefinido ''say'' para C: Class
Incluir
Cuando
include
un módulo en su clase, es como si tomara el código definido dentro del módulo y lo insertara dentro de la clase, donde lo "incluyó". Permite el comportamiento ''mixin''. Se utiliza para DRY up 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.
module Log
def class_type
"This class is of type: #{self.class}"
end
end
class TestClass
include Log
# ...
end
tc = TestClass.new.class_type # -> success
tc = TestClass.class_type # -> error
Exigir
El método requerido le permite cargar una biblioteca y evita que se cargue más de una vez. El método requerido devolverá ''falso'' si intenta cargar la misma biblioteca después de la primera vez. El método requerido solo debe usarse si la biblioteca que está cargando se define en un archivo separado, lo que suele ser el caso.
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 requerido en la parte superior de su archivo ".rb":
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, al utilizar el método de carga, debe especificar la extensión ".rb" del nombre del archivo de la biblioteca.
Ampliar
Al usar el método extend en lugar de incluir, está agregando los métodos del módulo como métodos de clase en lugar de como métodos de instancia.
module Log
def class_type
"This class is of type: #{self.class}"
end
end
class TestClass
extend Log
# ...
end
tc = TestClass.class_type
require(name)
Se devolverá bolean true / false
El nombre que se pasa como parámetro al requerimiento, ruby intentará encontrar el archivo fuente con ese nombre en su ruta de carga. El método requerido devolverá ''falso'' si intenta cargar la misma biblioteca después de la primera vez. El método requerido solo debe usarse si la biblioteca que está cargando se define en un archivo separado. Por lo tanto, realiza un seguimiento de si esa biblioteca ya estaba cargada o no.
include module_name
Supongamos que si tiene algunos métodos que necesita tener en dos clases diferentes. Entonces no tienes que escribirlas en las dos clases. En su lugar lo que puedes hacer es, definirlo en el módulo. Y luego incluir este módulo en otras clases. Es provisto por Ruby solo para asegurar el principio DRY. Se utiliza para SECAR su código para evitar la duplicación
Ruby
require
es más como "incluir" en otros idiomas (como C). Le dice a Ruby que desea traer el contenido de otro archivo . Mecanismos similares en otros idiomas son:Ruby
include
es un mecanismo de herencia orientado a objetos que se utiliza para los mixins .
Aquí hay una buena explicación:
[La] respuesta simple es que requieren e incluyen esencialmente no están relacionados.
"Requerir" es similar a la inclusión de C, lo que puede causar confusión en el novato (Una diferencia notable es que los locales dentro del archivo requerido se "evaporan" cuando se realiza el requerimiento).
La inclusión de Ruby no es nada como la inclusión de C. La declaración de inclusión "mezcla en" un módulo en una clase. Es una forma limitada de herencia múltiple . Un módulo incluido otorga literalmente una relación "is-a" a la cosa que lo incluye.
Énfasis añadido.