¿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 Él o include que?

preguntado el 25 de noviembre de 08 a las 15:11

Por lo que vale, aquí hay enlaces a la documentación de la comunidad para require y include, y también relevante, Module#append_features. -

11 Respuestas

¿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 include hace en la mayoría de los otros lenguajes de programación: ejecutar otro archivo. También rastrea lo que ha requerido en el pasado y no requerirá el mismo archivo dos veces. Para ejecutar otro archivo sin esta funcionalidad agregada, puede usar 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. Esta es una cosa a nivel de idioma en lugar de una cosa a nivel de archivo como require. El método de inclusión es la forma principal de "extender" las clases con otros módulos (normalmente denominados mix-ins). Por ejemplo, si su clase define el método "each", puede incluir el módulo mixin Enumerable y puede actuar como una colección. Esto puede resultar confuso ya que el verbo include se usa de manera muy diferente en otros idiomas.

Source

Entonces, si solo desea usar un módulo, en lugar de extenderlo o hacer una mezcla, entonces querrá usar require.

Curiosamente, Ruby require es análogo a C include, mientras que Ruby include es casi nada como C include.

Respondido el 15 de enero de 17 a las 15:01

De hecho, C's include, no carga un archivo como se requiere, sino que reemplaza la línea #include, por el contenido del archivo. Los archivos incluidos no tienen que ser 'encabezado' y #include no tiene que estar al principio del archivo, pero pueden estar en cualquier lugar, como en la clase o incluso en una definición de método. Esto significa que puede hacer mixin en C ++ escribiendo algunos métodos en un archivo e incluirlo en el código de una clase, exactamente como lo haría en ruby. Así que no están tan lejos, aunque de hecho no es una práctica común en C's. - mb14

Esta respuesta podría beneficiarse al incluir ejemplos. - Oso travis

El comentario de mb14 implica esto, pero vale la pena decirlo explícitamente: contrariamente a lo que dice la respuesta, require does no "ejecutar" un archivo, pero más bien lo carga como si fuera parte del archivo que lo contiene. Esto puede parecer una minucia semántica, pero en realidad es una diferencia bastante importante. - lonny eachus

@LonnyEachus: Esto está mal. require simplemente ejecuta el archivo. Período. En particular, esto significa que si pones el require llamar dentro de una declaración de clase, el código en el archivo no formar parte de esa clase, si pones el require llamar dentro de una definición de método, el código en el archivo no formar parte de ese método, si pones el require llamar dentro de una declaración de módulo, el código en el archivo no formar parte de ese módulo, y así sucesivamente. Ni siquiera se convierte en parte del archivo require la llamada está disponible. Hay muchas preguntas aquí en desbordamiento de pila que son … - Jörg W. Mittag

@GregSchmit: include en Ruby es simplemente herencia. class C; include M end hace M la superclase de C y la (antigua) superclase de C la superclase de M. No creo que C's include funciona por herencia, creo que es una simple sustitución textual / léxica. - Jörg W. Mittag

Si está utilizando un módulo, eso significa que está incorporando todos los métodos a su clase. Si usted extend una clase con un módulo, eso significa que está "incorporando" los métodos del módulo como clase métodos. Si usted include una clase con un módulo, eso significa que está "incorporando" los métodos del módulo como ejemplo métodos.

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 'decir' para B: Clase

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

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

C.new.say => método indefinido 'decir' para C: Clase

Respondido 08 Abr '13, 01:04

Creo que esto no responde la pregunta, pero es lo que estaba buscando =) - Ciro Santilli TRUMP BAN ES MALO

En realidad, esto no responde a la pregunta de cuáles son las diferencias entre require y include están. - usuario456814

Del libro Metaprogramming Ruby,

La require() El método es bastante similar a load(), pero tiene un propósito diferente. Tu usas load() para ejecutar código, y usas require() para importar bibliotecas.

contestado el 20 de mayo de 12 a las 03:05

Vota a favor por no comparar con otro idioma en tu respuesta :) - Stevo

Votar en contra por no dar una respuesta en el contexto de la pregunta: "¿Si solo quiero usar los métodos de un módulo en mi clase?" - banco

  • Rubí require es más como "incluir" en otros idiomas (como C). Le dice a Ruby que quieres traer el contenido de otro archivo. Mecanismos similares en otros idiomas son:

  • Rubí 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 no están esencialmente relacionados.

"exigir" es similar a la inclusión de C, lo que puede causar confusión a los principiantes. (Una diferencia notable es que los locales dentro del archivo requerido se "evaporan" cuando se realiza el requerimiento).

El rubí incluiyendo no se parece en nada al C include. La declaración de inclusión "mezcla" un módulo en una clase. Es un forma limitada de herencia múltiple. Un módulo incluido otorga literalmente una relación "es-un" a la cosa que lo incluye.

Énfasis añadido.

respondido 06 nov., 19:23

La importación de módulos no es como la inclusión de archivos, ya que no tiene nada que ver necesariamente con la representación de la fuente externa del programa. Es más como el include aquí. Los espacios de nombres, los paquetes y los objetos con tipos de clases pueden tratarse como especializados ambientes que contienen enlaces de nombre en general. (Considerar estas diferencias y Kernel's $import!. También observa que los entornos de Racket se implementan en espacios de nombres). FrankHB

¿Alguna vez has intentado require un modulo? ¿Cuáles fueron los resultados? Sólo inténtalo:

MyModule = Module.new
require MyModule # see what happens

No se pueden requerir módulos, ¡solo se incluyen!

Respondido el 12 de junio de 13 a las 04:06

La afirmación aquí no es correcta. Se pueden requerir módulos. Y cualquiera que ejecute el código anterior encontrará que recibe el mismo resultado (TypeError) si la palabra Module se cambia a Class. - pjd

Desde Programación de Ruby 1.9

Haremos 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 referencia a un módulo. Si ese módulo está en un archivo separado, debe usar require (o su primo de uso menos común, load) 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 cambio, hace una referencia de la clase al módulo incluido. Si varias clases incluyen ese módulo, todas 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 ese módulo exhibirán el nuevo comportamiento.

Respondido 25 ago 14, 02:08

'Cargar': inserta el contenido de un archivo (analiza el archivo cada vez que se llama al archivo)

'Requerir': inserta el contenido analizado de un 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

'Extend': incluye el módulo en la clase y puede usar métodos dentro del módulo como método de clase

Respondido el 12 de enero de 20 a las 22:01

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.

Cargar El método de carga es casi como el método require 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 usa 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á 'falso' 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, que suele ser el caso.

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

respondido 27 nov., 14:10

Incluyendo

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 '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.

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 require le permite cargar una biblioteca y evita que se cargue más de una vez. El método require devolverá 'falso' 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, que suele ser el caso.

Por lo tanto, realiza un seguimiento de si esa biblioteca ya se cargó o no. Tampoco es necesario que especifique la extensión ".rb" del nombre del archivo de la biblioteca. A continuación, se muestra un ejemplo de cómo utilizar require. Coloque el método require en la parte superior de su archivo ".rb":

Carga

El método de carga es casi como el método require 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, además, cuando utilice el método de carga, debe especificar la extensión ".rb" del nombre del archivo de la biblioteca.

ampliar

Cuando usa el método extender 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

respondido 17 nov., 17:19

A continuación, se muestran algunas diferencias básicas entre requerir e incluir:

Exigir:

  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 va a cambiar algo mientras se ejecuta el script, ese cambio no se reflejará.
  2. Requerimos archivo por nombre, no por nombre de módulo.
  3. Suele utilizarse para bibliotecas y extensiones.

Incluye:

  1. 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.
  2. Incluimos el nombre del módulo, no el nombre del archivo.
  3. Por lo general, se usa para secar el código y eliminar la duplicación en el código.

Respondido 28 Feb 18, 20:02

require(name)

Devolverá bolean 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 método require devolverá 'falso' 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 que realiza un seguimiento de si esa biblioteca ya se cargó o no.

include module_name

Suponga 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 module. Y luego incluir este módulo en otras clases. Es proporcionado por Ruby solo para asegurar el principio DRY. Se usa para SECAR su código para evitar la duplicación

Respondido el 04 de enero de 16 a las 13:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.