¿Cuál es la diferencia entre incluir y requerir en Ruby?


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 it o include it?

Author: Community, 2008-11-25

10 answers

¿Cuál es la diferencia entre ¿"incluir" y "requerir" en Ruby?

Respuesta:

Los métodos include y require hacen cosas muy diferentes.

El método require hace lo que incluye hace en la mayoría de la otra programación idiomas: ejecute otro archivo. También realiza un seguimiento de lo que ha requerido en el pasado y no requerirá el mismo archivo doblemente. Para ejecutar otro archivo sin esta funcionalidad añadida, se puede utilizar carga método.

El método include toma todos los métodos de otro módulo y incluye en el módulo actual. Esto es una cosa a nivel de idioma como opuesto a una cosa a nivel de archivo como con requerir. El método include es el forma principal de" extender " clases con otros módulos (generalmente referidos como mezclas). Por ejemplo, si su clase define el método "cada", puede incluir el módulo mixin Enumerable y puede actuar como una colección. Este puede ser confuso como el verbo incluir se utiliza de manera muy diferente en otros idioma.

Fuente

Así que si solo desea 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 include de C, mientras que el include de Ruby es casi nada como el include de C.

 501
Author: HanClinto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-15 15:47:54

Del libro Ruby de Metaprogramación,

El método require() es bastante similar a load(), pero está destinado a un propósito diferente. Usa load() para ejecutar código, y usa require() para importar bibliotecas.

 88
Author: Pratik Khadloya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-20 02:34:56

Si estás usando un módulo, eso significa que estás trayendo todos los métodos a tu clase. Si extend una clase con un módulo, eso significa que está "trayendo" los métodos del módulo como métodos class. Si include una clase con un módulo, eso significa que está "trayendo" 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 = > undefined method ' say ' for B: Class

B.new.say = > este es el módulo A

C.say = > este es el módulo A

C.new.say = > undefined method ' say ' for C: Class

 83
Author: Peter Dang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-08 00:28:00
  • Ruby require es más como "incluir" en otros lenguajes (como C). Le dice a Ruby que quieres introducir el contenido de otro archivo. Mecanismos similares en otros idiomas son:

  • Ruby include es un mecanismo de herencia orientado a objetos utilizado para mixins.

Hay una buena explicación aquí :

[La] respuesta simple es que requerir e incluir están esencialmente no relacionados.

"require" es similar a C include, lo que puede causar confusión a los novatos. (Una diferencia notable es que los locales dentro del archivo requerido " evaporar" cuando se hace el requerimiento.)

El Ruby include no es nada como el C include. La instrucción include "mezcla" un módulo en una clase. Es un forma limitada de múltiples herencia. Un módulo incluido literalmente otorga un " is-a" relación en la cosa incluyéndolo.

El subrayado es nuestro.

 54
Author: bradheintz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:36

¿Alguna vez has intentado require un módulo? ¿Cuáles fueron los resultados? Solo inténtalo:

MyModule = Module.new
require MyModule # see what happens

Los módulos no son necesarios, ¡solo están incluidos!

 7
Author: Boris Stitnicky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-12 03:29:38

Desde Programando Ruby 1.9

Haremos un par de puntos sobre la declaración include antes de continuar. Primero, tiene nada que ver con archivos. Los programadores de C usan una directiva de preprocesador llamada # include to inserte el contenido de un archivo en otro durante la compilación. La declaración Ruby include simplemente hace una referencia a un módulo. Si ese módulo está en un archivo separado, debe usar require (o su primo menos utilizado, load) para arrastrar ese archivo antes de usar include. Segundo, un Ruby include 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 si incluyes ese módulo, todos apuntarán a lo mismo. 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 incluyen el módulo mostrará el nuevo comportamiento.

 7
Author: cizixs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-25 01:48:46

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 hay varias clases que necesitarían el mismo código dentro del módulo.

Cargar El método load es casi como el método require, excepto que no realiza un seguimiento de si esa biblioteca ha sido cargar. Por lo tanto, es posible cargar una biblioteca varias veces y también cuando se utiliza el método de carga debe especificar el ".rb " extensión 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 requerir método devuelve 'false' si intenta cargar la misma biblioteca después de la primera vez. El método require solo necesita usarse si la biblioteca que está cargando está definida en un archivo separado, que generalmente es el caso.

Puedes preferir esto http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend /

 2
Author: Sanket,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-27 10:16:21
require(name)

Devolverá boleano verdadero / falso

El nombre que se pasa como parámetro al require, ruby intentará encontrar el archivo fuente con ese nombre en su ruta de carga. El requerir método devuelve 'false' si intenta cargar la misma biblioteca después de la primera vez. El método require solo necesita ser utilizado 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.

include module_name

Supongamos que si usted tiene algunos métodos que necesita tener en dos clases diferentes. Entonces no tienes que escribirlos en las dos clases. En su lugar, lo que puede hacer es definirlo en el módulo. Y luego incluir este módulo en otras clases. Es proporcionado por Ruby solo para garantizar el principio SECO. Se utiliza para SECAR el código para evitar la duplicación

 2
Author: Shrinivas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-04 13:55:09

Include

Cuando include un módulo en su clase, es como si usted tomó el código definido dentro del módulo e insertado dentro de la clase, donde lo 'incluyes'. Permite el comportamiento 'mixin'. Se usa para secarse. su código para evitar la duplicación, por ejemplo, si hubo múltiples 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

Requerir

El método require le permite cargar una biblioteca y impide ser cargado más de una vez. El método require devolverá 'false' si intenta cargar la misma biblioteca después de la primera vez. La necesidad el método solo debe usarse si la biblioteca que está cargando está definida en un archivo separado, que suele ser el caso.

Así que mantiene un registro de si esa biblioteca ya estaba cargada o no. Tampoco es necesario especificar el".rb " extensión del nombre del archivo de la biblioteca. Aquí hay un ejemplo de cómo usar require. Coloque el requerir método en la parte superior de su".archivo rb":

Load

El método load es casi como el método require, excepto que no lo hace mantenga un registro de si esa biblioteca se ha cargado o no. Así que es es posible cargar una biblioteca varias veces y también cuando se utiliza la carga método debe especificar el ".rb " extensión del nombre del archivo de la biblioteca.

Extender

Al usar el método extend en lugar de include, está agregando el 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
 0
Author: Imran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-17 19:47:20

A continuación se presentan algunas diferencias básicas entre require e include:

Requiere:

  1. Require lee el archivo del sistema de archivos, lo analiza, lo guarda en la memoria y lo ejecuta en un lugar determinado, lo que significa que si incluso cambia algo mientras se ejecuta el script, ese cambio no se reflejará.
  2. Requerimos el archivo por nombre, no por el nombre del módulo.
  3. Se usa típicamente para bibliotecas y extensiones.

Incluye:

  1. Cuando se incluye un módulo en tu clase se comporta como si tomaras el código definido en tu módulo y lo insertaras en tu clase.
  2. Incluimos el nombre del módulo, no el nombre del archivo.
  3. Normalmente se usa para secar el código y eliminar la duplicación en el código.
 0
Author: Awais Shafqat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-28 20:54:45