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




require (9)

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 ?


Answers

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


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.


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


Del libro Metaprogramming Ruby,

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


A continuación se presentan algunas diferencias básicas entre requieren e incluyen:

Exigir:

  1. 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á.
  2. Requerimos archivo por nombre, no por nombre de módulo.
  3. Normalmente se utiliza para bibliotecas y extensiones.

Incluir:

  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. Normalmente se utiliza para secar el código y eliminar la duplicación en el código.

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

¿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!


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

Source

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.


La mayoría de las respuestas anteriores utilizan código. Esta explicación intenta responderla sin usar ningún código:

Explicación vía analogía

Las partes externas no pueden acceder a los secretos internos de la CIA

  • Imaginemos un lugar realmente secreto: la CIA. Nadie sabe lo que está sucediendo en la CIA aparte de las personas dentro de la CIA. En otras palabras, las personas externas no pueden acceder a ninguna información en la CIA. Pero como no es bueno tener una organización que sea completamente secreta, cierta información está disponible para el mundo exterior, solo las cosas que la CIA quiere que todos conozcan, por ejemplo: el Director de la CIA, qué tan amigable para el medio ambiente es este departamento. a todos los demás departamentos gubernamentales, etc. Otra información: por ejemplo, quiénes son sus agentes encubiertos en Irak o Afganistán, este tipo de cosas probablemente se mantendrá en secreto durante los próximos 150 años.

  • Si está fuera de la CIA, solo puede acceder a la información que ha puesto a disposición del público. O, para usar el lenguaje de la CIA, solo puede acceder a la información que está "borrada".

  • La información que la CIA quiere poner a disposición del público en general fuera de la CIA se denomina atributos.

El significado de los atributos de lectura y escritura:

  • En el caso de la CIA, la mayoría de los atributos son "solo lectura". Esto significa que si usted es una parte ajena a la CIA, puede preguntar: "¿quién es el director de la CIA?" y obtendrás una respuesta directa. Pero lo que no puede hacer con los atributos de "solo lectura" es hacer cambios en la CIA. por ejemplo, no puede hacer una llamada telefónica y de repente decide que desea que Kim Kardashian sea el Director, o que desea que Paris Hilton sea el Comandante en Jefe.

  • Si los atributos le dieron acceso de "escritura", entonces podría hacer cambios si lo desea, incluso si estuviera afuera. De lo contrario, lo único que puedes hacer es leer.

    En otras palabras, los accesores le permiten realizar consultas, o realizar cambios, a organizaciones que de otro modo no permiten el acceso de personas externas, según si los accesores son de acceso de lectura o de escritura.

Los objetos dentro de una clase pueden acceder fácilmente entre sí

  • Por otro lado, si ya estaba dentro de la CIA, podría llamar fácilmente a su agente de la CIA en Kabul y preguntarle si quiere tomar una cerveza con el informante local de Kabul después del trabajo. Pero si está fuera de la CIA, simplemente no se le dará acceso: no podrá saber quiénes son (acceso de lectura), y no podrá cambiar su misión (acceso de escritura).

Exactamente lo mismo con las clases y su capacidad para acceder a variables, propiedades y métodos dentro de ellas. HTH! Cualquier pregunta, por favor pregunte y espero poder aclarar.







ruby include require