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




include require (7)

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

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!


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 a load() , pero tiene un propósito diferente. Utiliza load() para ejecutar código, y require() para importar bibliotecas.


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

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.





require