La mia domanda è simile a " Qual è la differenza tra include ed estende in Ruby? ".
Qual è la differenza tra require
e include
in Ruby? Se voglio solo utilizzare i metodi da un modulo nella mia classe, dovrei require
o include
che?
La mia domanda è simile a " Qual è la differenza tra include ed estende in Ruby? ".
Qual è la differenza tra require
e include
in Ruby? Se voglio solo utilizzare i metodi da un modulo nella mia classe, dovrei require
o include
che?
Risposte:
Qual è la differenza tra "includi" e "richiedi" in Ruby?
Risposta:
I metodi include e richiedono fanno cose molto diverse.
Il metodo Require fa ciò che include nella maggior parte degli altri linguaggi di programmazione: eseguire un altro file. Tiene traccia anche di ciò che hai richiesto in passato e non richiederà lo stesso file due volte. Per eseguire un altro file senza questa funzionalità aggiunta, è possibile utilizzare il metodo di caricamento.
Il metodo include prende tutti i metodi da un altro modulo e li include nel modulo corrente. Questa è una cosa a livello di lingua al contrario di una cosa a livello di file che richiede. Il metodo include è il modo principale per "estendere" le classi con altri moduli (di solito chiamati mix-in). Ad esempio, se la tua classe definisce il metodo "ciascuno", puoi includere il modulo Mixin Enumerable e può fungere da raccolta. Questo può essere fonte di confusione poiché il verbo include è usato in modo molto diverso in altre lingue.
Quindi, se vuoi semplicemente usare un modulo, piuttosto che estenderlo o fare un mix-in, allora vorrai usare require
.
Stranamente, Ruby require
è analoga a C del include
, mentre Ruby include
è quasi niente come C di include
.
include
in Ruby è semplicemente eredità. class C; include M end
crea M
la superclasse di C
e la (ex) superclasse di C
superclasse di M
. Non penso che C include
funzioni per eredità, penso che sia una semplice sostituzione testuale / lessicale.
Se stai usando un modulo, significa che stai portando tutti i metodi nella tua classe. Se sei extend
una classe con un modulo, significa che stai "portando" i metodi del modulo come metodi di classe . Se sei include
una classe con un modulo, significa che stai "portando" i metodi del modulo come metodi di istanza .
EX:
module A
def say
puts "this is module A"
end
end
class B
include A
end
class C
extend A
end
B.say
=> metodo non definito 'dire' per B: Classe
B.new.say
=> questo è il modulo A
C.say
=> questo è il modulo A
C.new.say
=> metodo non definito 'say' per C: Class
Dal libro Ruby sulla metaprogrammazione,
Il
require()
metodo è abbastanza simileload()
, ma è pensato per uno scopo diverso. Utilizziload()
per eseguire il codice erequire()
per importare le librerie.
Ruby require
è più simile a "include" in altre lingue (come C). Indica a Ruby che vuoi portare il contenuto di un altro file . Meccanismi simili in altre lingue sono:
Ruby include
è un meccanismo di ereditarietà orientato agli oggetti utilizzato per i mixin .
C'è una buona spiegazione qui :
[La] risposta semplice è che richiedono e includi sono essenzialmente indipendenti.
"request" è simile al C include, che può causare confusione ai principianti. (Una differenza notevole è che i locali all'interno del file richiesto "evaporano" quando il requisito è completato.)
Il Ruby include non è come il C include. L'istruzione include "mescola" un modulo in una classe. È una forma limitata di eredità multipla . Un modulo incluso conferisce letteralmente una relazione "is-a" sulla cosa includendolo.
Enfasi aggiunta.
Hai mai provato require
un modulo? Quali sono stati i risultati? Prova:
MyModule = Module.new
require MyModule # see what happens
I moduli non possono essere richiesti, inclusi solo!
TypeError
) se la parola Module
viene cambiata in Class
.
Dalla programmazione di Ruby 1.9
Faremo un paio di punti sulla dichiarazione include prima di continuare. Innanzitutto, non ha nulla a che fare con i file. I programmatori C usano una direttiva preprocessore chiamata #include per inserire il contenuto di un file in un altro durante la compilazione. L'istruzione include di Ruby fa semplicemente riferimento a un modulo. Se quel modulo si trova in un file separato, devi usare il comando (o il suo cugino meno comunemente usato, caricare) per trascinare quel file prima di usare include. In secondo luogo, un'inclusione di Ruby non copia semplicemente i metodi di istanza del modulo nella classe. Invece, fa un riferimento dalla classe al modulo incluso. Se più classi includono quel modulo, indicheranno tutte la stessa cosa. Se modifichi la definizione di un metodo all'interno di un modulo, anche mentre il tuo programma è in esecuzione,
Includi Quando includi un modulo nella tua classe come mostrato di seguito, è come se prendessi il codice definito all'interno del modulo e lo inserissi nella classe, dove lo 'includi'. Permette il comportamento 'mixin'. Viene utilizzato per ASCIUGARE il codice per evitare la duplicazione, ad esempio, se vi fossero più classi che avrebbero bisogno dello stesso codice all'interno del modulo.
Carica Il metodo di caricamento è quasi come il metodo request tranne che non tiene traccia del caricamento o meno della libreria. Quindi è possibile caricare una libreria più volte e anche quando si utilizza il metodo load è necessario specificare l'estensione ".rb" del nome del file della libreria.
Require Il metodo Require consente di caricare una libreria e ne impedisce il caricamento più di una volta. Il metodo request restituirà 'false' se si tenta di caricare la stessa libreria dopo la prima volta. Il metodo Requisito deve essere utilizzato solo se la libreria che si sta caricando è definita in un file separato, come di solito accade.
Puoi preferire questo http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/
Di seguito sono riportate alcune differenze di base tra richiedono e includono:
Richiedere:
Includere:
require(name)
Restituirà bolean vero / falso
Il nome che viene passato come parametro al requisito, ruby proverà a trovare il file di origine con quel nome nel percorso di caricamento. Il metodo request restituirà 'false' se si tenta di caricare la stessa libreria dopo la prima volta. Il metodo request deve essere utilizzato solo se la libreria che si sta caricando è definita in un file separato. Quindi tiene traccia del fatto che quella libreria sia già stata caricata o meno.
include module_name
Supponiamo che tu abbia alcuni metodi che devi avere in due classi diverse. Quindi non devi scriverli in entrambe le classi. Invece quello che puoi fare è definirlo nel modulo. E quindi includere questo modulo in altre classi. È fornito da Ruby solo per garantire il principio DRY. Viene utilizzato per ASCIUGARE il codice per evitare la duplicazione
Includere
Quando fai
include
un modulo nella tua classe, è come se prendessi il codice definito all'interno del modulo e lo inserissi all'interno della classe, dove lo 'includi'. Permette il comportamento 'mixin'. Viene utilizzato per ASCIUGARE il codice per evitare la duplicazione, ad esempio, se vi fossero più classi che avrebbero bisogno dello stesso codice all'interno del modulo.
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
Richiedere
Il metodo Require consente di caricare una libreria e ne impedisce il caricamento più di una volta. Il metodo request restituirà 'false' se si tenta di caricare la stessa libreria dopo la prima volta. Il metodo Requisito deve essere utilizzato solo se la libreria che si sta caricando è definita in un file separato, che di solito è il caso.
Quindi tiene traccia del fatto che quella libreria sia già stata caricata o meno. Inoltre, non è necessario specificare l'estensione ".rb" del nome del file della libreria. Ecco un esempio di come utilizzare richiedono. Posiziona il metodo request nella parte superiore del file ".rb":
Caricare
Il metodo di caricamento è quasi come il metodo di richiesta, tranne che non tiene traccia del caricamento o meno della libreria. Quindi è possibile caricare una libreria più volte e anche quando si utilizza il metodo load è necessario specificare l'estensione ".rb" del nome del file della libreria.
Estendere
Quando si utilizza il metodo di estensione invece di includere, si stanno aggiungendo i metodi del modulo come metodi di classe anziché come metodi di istanza.
module Log
def class_type
"This class is of type: #{self.class}"
end
end
class TestClass
extend Log
# ...
end
tc = TestClass.class_type
'Carica': inserisce il contenuto di un file (file di analisi ogni volta che viene chiamato il file)
'Require': inserisce un contenuto analizzato del file (file analizzato una volta e archiviato in memoria)
'Includi': include il modulo nella classe e può usare metodi all'interno del modulo come metodo di istanza della classe
'Estendi': include il modulo nella classe e può usare metodi all'interno del modulo come metodo di classe
require
einclude
, e anche rilevanti,Module#append_features
.