2008-11-25 9 views
412

Mi pregunta es similar a "What is the difference between include and extend in Ruby?".¿Cuál es la diferencia entre include y require en Ruby?

¿Cuál es la diferencia entre require y include en Ruby? Si solo quiero utilizar los métodos de un módulo en mi clase, ¿debo require o include?

+1

Por lo que vale, aquí hay enlaces a la documentación de la comunidad para ['require'] (http://www.ruby-doc.org/core-2.1.1/Kernel.html#method-i- require) y ['include'] (http://ruby-doc.org/core-2.1.1/Module.html#method-i-include), y también relevante, [' Module # append_features'] (http: //ruby-doc.org/core-2.1.1/Module.html#method-i-append_features). –

Respuesta

487

¿Cuál es la diferencia entre "incluyen" y "exigir" en Ruby?

Respuesta:

El incluir y requiere métodos hacen cosas muy diferentes.

El método require hace lo que incluye hace en la mayoría de otros programas idiomas: ejecuta 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 adicional, puede usar el método de carga. El método include toma todos los métodos de otro módulo y los incluye en el módulo actual. Esto es un nivel de idioma como opuesto a una cosa de nivel de archivo como con requieren. El método de inclusión es la forma principal de de "extender" las clases con otros módulos (generalmente conocidos como mix-ins). 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. Este puede ser confuso ya que el verbo de inclusión se usa de manera muy diferente en otros idiomas .

Source

Así que si lo que desea es utilizar un módulo, en lugar de ampliarlo o hacer una confusión, entonces usted querrá usar require.

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

+35

De hecho, las C incluyen, 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 tienen que estar al principio del archivo, pero pueden estar en cualquier lugar, como en clase o incluso en una definición de método. Esto significa que puedes mezclar en C++ escribiendo algunos métodos en un archivo e incluirlo en el código de una clase, exactamente lo que harías en ruby. Entonces no están tan lejos, a pesar de que de hecho no es una práctica común en C's. – mb14

+11

Esta respuesta podría beneficiarse al incluir ejemplos. –

+11

El comentario de mb14 implica esto, pero vale la pena indicarlo explícitamente: al contrario de lo que dice la respuesta, require ** ** no "ejecuta" un archivo, sino que lo carga como si fuera parte del archivo contenedor. Esto podría parecer una travesura semántica, pero en realidad es una diferencia bastante importante. –

53
  • Rubí require es más como "incluyen" en otros idiomas (como C). Le dice a Ruby que desea 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 here:

[El] respuesta sencilla es que requieren e incluyen son esencialmente no relacionada.

"requiere" es similar a la C incluida, que puede causar confusión entre los novatos. (Una diferencia notable es que los locales dentro del archivo requerido "se evaporan" cuando la necesita es hecho.)

El Rubí incluyen es nada como el C incluyen. La instrucción include "mezcla" un módulo en una clase. Es un forma limitada de herencia múltiple. Un módulo incluido literalmente otorga una relación "is-a" en la cosa que lo incluye.

Énfasis añadido.

85

Del libro Metaprogramación Ruby,

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

+60

Votación por no comparar con otro idioma en su respuesta :) – Stevo

+70

Voto por no mencionar incluir() en absoluto. –

+0

Abajo el voto por no proporcionar una respuesta en el contexto de la pregunta: "¿Si solo quiero usar los métodos de un módulo en mi clase?" – benc

71

Si está utilizando un módulo, eso significa que está incorporando todos los métodos en su clase. Si tiene extend una clase con un módulo, eso significa que está "incorporando" los métodos del módulo como métodos de clase. Si tiene 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 no definido '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

+15

Creo que esto no responde a la pregunta, pero es lo que estaba buscando =) –

+1

Esto no responde a la pregunta de cuáles son las diferencias entre 'require' y' include' . –

7

¿Alguna vez ha intentado con require un módulo? ¿Cuáles fueron los resultados?Intente lo siguiente:

MyModule = Module.new 
require MyModule # see what happens 

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

6

De de programación Ruby 1,9

Haremos un par de puntos sobre el orden de inclusión antes de continuar. En primer lugar, tiene nada que ver con los archivos. Los programadores C usan una directiva de preprocesador llamada #include to inserta el contenido de un archivo en otro durante la compilación. La instrucción include Ruby simplemente hace referencia a un módulo. Si ese módulo está en un archivo separado, debe usar require (o su primo menos utilizado, cargar) para arrastrar ese archivo antes de usar include. En segundo lugar, una inclusión de Ruby no solo 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 las clases múltiples incluyen ese módulo, todas señalarán 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 incluyan ese módulo exhibirán el nuevo comportamiento.

2

Incluir cuando se incluye un módulo en su clase, como se muestra a continuación, es que si se toma el código definido dentro del módulo y lo insertó dentro de la clase, en la que ‘se entienden’ la misma. Permite el comportamiento 'mixin'. Se usa para SECAR tu 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 obligatorio, excepto que no hace 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.

Requiere El método require le permite cargar una biblioteca e impide 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 necesita ser utilizado si la biblioteca que está cargando está definida en un archivo separado, que generalmente es el caso.

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

2
require(name) 

Se volverá bolean verdadero/falso

El nombre que se pasa como parámetro a la requiere, rubí intentará encontrar el archivo de origen con ese nombre en tu camino 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 necesita ser utilizado si la biblioteca que está cargando está definida en un archivo separado. Por lo tanto, realiza un seguimiento de si la biblioteca ya estaba cargada o no.

include module_name 

Supongamos que tiene algunos métodos que necesita tener en dos clases diferentes. Entonces no tienes que escribirlos en ambas clases. En cambio, lo que puedes hacer es definirlo en el módulo. Y luego incluye este módulo en otras clases. Es provisto por Ruby solo para garantizar el principio DRY.Se utiliza para secar su código para evitar la duplicación

0

Incluir

Cuando include un módulo en su clase, es que si se toma el código definido dentro del módulo y lo insertó dentro de la clase , donde lo 'incluye'. Permite el comportamiento 'mixin'. Se usa para SECAR su código para evitar la duplicación, por ejemplo, si hubiera 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 requiere le permite cargar una biblioteca y evita que se 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. El método require solo necesita ser usado si la biblioteca que está cargando está definida en en un archivo separado, que generalmente es el caso.

Por lo tanto, realiza un seguimiento de si la 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 requiere en la parte superior de su archivo “.rb”:

carga

El método de carga es casi igual que el método requiere excepto que no un seguimiento de si o no esa biblioteca ha sido cargada De modo que es posible cargar una biblioteca varias veces y también cuando se utiliza el método de carga debe especificar la extensión ".rb" del nombre del archivo de la biblioteca.

Extender

Cuando se utiliza el método de extender en lugar de incluir, que está añadiendo 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

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

Requerir:

  1. Requerir 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 si incluso cambia algo mientras se ejecuta el script, ese cambio no se reflejará.
  2. Requerimos archivo por nombre, no por nombre de módulo.
  3. Se usa generalmente para bibliotecas y extensiones.

incluyen:

  1. Cuando se incluye un módulo en su clase se comporta como si se toma el código definido en el módulo y lo insertó en su 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.
Cuestiones relacionadas