2013-03-13 7 views
13

Dalle ModuleQual è la differenza tra "include" e "anteporre" in Ruby?

Module # append_features (MOD) → mod => Quando questo modulo è incluso in un altro, Ruby chiama append_features in questo modulo, passandogli il modulo ricevente in mod. implementazione di default di Ruby è per aggiungere le costanti, i metodi e le variabili di modulo di questo modulo di mod se questo modulo non è già stato aggiunto al mod o uno dei suoi antenati.

Modulo # prepend_features (mod) → mod => Quando questo modulo è inserito in un altro, Ruby chiama prepend_features in questo modulo, passandogli il modulo di ricezione in mod. implementazione di default di Ruby è di sovrapporre le costanti, i metodi e le variabili di modulo di questo modulo di mod se questo modulo non è già stato aggiunto al mod o uno dei suoi antenati.

Qualcuno mi può aiutare a comprendere le domande che seguono:

  • Che cosa di più caratteristiche di Module sono definiti come append e prepend ad eccezione di quelli di default?

  • Come si differenziano funzionalmente?

  • Quando utilizzare append_features e quando prepend_features?

  • qual è la differenza tra le due linee decise di cui sopra?

risposta

19
  • Quali caratteristiche del modulo sono definiti come append e anteporre?

Come specificato nel testo che hai citato:

le costanti, i metodi e le variabili di modulo

  • Come si differenziano funzionalmente?

Entrambi aggiungono metodi del modulo misto nel modulo passato (classe).La differenza è nell'ordine di ricerca di questi metodi, nel caso che la classe di destinazione già li ha definito:

include si comporta come se la classe bersaglio ereditato mista modulo:

module FooBar 
    def say 
    puts "2 - Module" 
    end 
end 

class Foo 
    include FooBar 

    def say 
    puts "1 - Implementing Class" 
    super 
    end 
end 

Foo.new.say # => 
      # 1 - Implementing Class 
      # 2 - Module 

prepend rende i metodi dal mista nel modulo "più forte" e li esegue prima:

module FooBar 
    def say 
    puts "2 - Module" 
    super 
    end 
end 

class Foo 
    prepend FooBar 

    def say 
    puts "1 - Implementing Class" 
    end 
end 

Foo.new.say # => 
      # 2 - Module 
      # 1 - Implementing Class 

l'esempio gentilmente strappato via da qui: http://blog.crowdint.com/2012/11/05/3-killer-features-that-are-coming-on-ruby-2-0.html

  • Quando utilizzare append_features e quando prepend_features?

Usa prepend quando si desidera mantenere i metodi del modulo di destinazione (classe) alla fine della catena di metodo di ricerca.

Alcuni esempi reali si possono trovare cercando SO ruby, module e prepend:

(Nota: io sto solo menzionare metodi, in quanto sono più facili da immaginare quando si tratta di ereditarietà e missaggio , ma lo stesso vale per altre caratteristiche.)

+0

'+ 1'. A partire dal doc, l'implementazione predefinita di Ruby consiste nell'aggiungere le costanti, i metodi e le variabili del modulo di questo modulo '. Questo è ok. altre caratteristiche eccetto quelle? –

+0

Bella spiegazione che hai dato qui. Potresti esaminare la mia ultima domanda e aggiornare le prime domande? –

+0

1) niente di più, (solo ?!) costanti, metodi e moduli vars. 4) è essenzialmente uguale a 2) e viene spiegato attraverso l'esempio. –