2013-07-05 24 views
8

Quali sono i vantaggi e gli svantaggi dell'utilizzo di Struct rispetto alla definizione di un metodo initialize?Ruby: Struct vs Initialize

Posso già vedere che si tratta di meno codice e non aumentare quando manca un argomento:

Utilizzando struct:

class Fruit < Struct.new(:name) 
end 

> Fruit.new.name 
=> nil 
> Fruit.new('apple').name 
=> "apple" 

Utilizzando inizializzare:

class Fruit 
    attr_accessor :name 

    def initialize(name) 
    @name = name 
    end 
end 

> Fruit.new.name 
ArgumentError: wrong number of arguments (0 for 1) 
> Fruit.new('apple').name 
=> "apple" 

Quali sono i tuoi pensieri? Stai usando Struct frequentemente nei tuoi progetti?

+1

Qual è il tuo caso d'uso? 'Struct' è ottimo per le cose che non hanno molta logica aggiuntiva. – tadman

+0

Voglio solo i tuoi pensieri su questo quando hai bisogno di definire le classi con gli inizializzatori. Dal momento che l'utilizzo di 'Struct' sembra essere" più sexy ", mi piacerebbe conoscere gli elenchi a discesa, se presenti. –

+0

Se si dispone di un caso d'uso specifico, questa è una domanda sull'argomento. Se vuoi solo generare una discussione sui pro e contro delle varie implementazioni, non è una buona idea per il formato Q & A. –

risposta

14

La classe (non-struct) ha un albero di ascendenza più semplice:

>> Fruit.ancestors 
=> [Fruit, Object, Kernel, BasicObject] 

Rispetto alla versione struct:

>> Fruit.ancestors 
=> [Fruit, #<Class:0x1101c9038>, Struct, Enumerable, Object, Kernel, BasicObject] 

Quindi, la classe Struct potrebbe essere scambiato per un array (raro, ma assolutamente potrebbe accadere)

fruit = Fruit.new("yo") 
# .. later 
fruit.each do |k| 
    puts k 
end 
# outputs: yo 

Quindi ... io uso Structs come oggetti di dati e getta. Uso classi "reali" nel mio dominio e applicazione.

+0

Interessante! Sicuramente non vuoi usarli come 'Class' se non si comportano come allora. Grazie. Vedrò cosa gli altri hanno da dire al riguardo e accetterò la risposta di conseguenza :) –

+9

Penso che l'idea giusta sia che tu usi 'Struct' per semplici contenitori di dati, in alternativa al passaggio di Hash in giro, e usi un oggetto appropriato quando in realtà stai aggiungendo qualsiasi tipo di logica. – tadman