Dalla documentazione Struct:
una struct è un modo conveniente per raggruppare insieme un numero di attributi, usando metodi accessor, senza dover scrivere una classe esplicita.
D'altra parte, un Hash:
Un hash è una raccolta di coppie di valori-chiave. È simile a una matrice, tranne per il fatto che l'indicizzazione viene eseguita tramite chiavi arbitrarie di qualsiasi tipo di oggetto, non un indice intero. L'ordine in cui attraversi un hash con una chiave o un valore può sembrare arbitrario e generalmente non si trova nell'ordine di inserimento.
La differenza principale è il modo in cui si accede ai dati.
ruby-1.9.1-p378 > Point = Struct.new(:x, :y)
=> Point
ruby-1.9.1-p378 > p = Point.new(4,5)
=> #<struct Point x=4, y=5>
ruby-1.9.1-p378 > p.x
=> 4
ruby-1.9.1-p378 > p.y
=> 5
ruby-1.9.1-p378 > p = {:x => 4, :y => 5}
=> {:x=>4, :y=>5}
ruby-1.9.1-p378 > p.x
NoMethodError: undefined method `x' for {:x=>4, :y=>5}:Hash
from (irb):7
from /Users/mr/.rvm/rubies/ruby-1.9.1-p378/bin/irb:17:in `<main>'
ruby-1.9.1-p378 > p[:x]
=> 4
ruby-1.9.1-p378 > p[:y]
=> 5
In breve, si potrebbe fare una nuova struttura quando si vuole una classe che è un "plain old data" structure (a scelta con l'intento di estendere con più metodi), e si dovrebbe utilizzare un hash, quando non hai bisogno di un tipo formale a tutti.
fonte
2010-07-18 13:03:22
I suoi altri punti sono tutti corretti (in modo +1 per questo), ma [ 'struct # == '] (http://ruby-doc.org/core/classes/Struct.html#M000890) funziona in modo diverso da quello che hai spiegato quando memorizzi il risultato di' Struct.new' invece di chiamarlo due volte con gli stessi argomenti. –
@MarkRushakoff: Se faccio 'Foo = Struct.new (: x); Bar = Struct.new (: x) 'e quindi do' Foo.new (42) == Bar.new (42) 'Otterrò falso. Se faccio 'Foo.new (42) == Foo.new (42)' Avrò vero. E se leggi attentamente, è esattamente quello che ho detto (due istanze di * diverse * structs "). – sepp2k
Capisco cosa intendi. Non era chiaro per me perché non lo mettevi in contrasto con una spiegazione che l'uguaglianza funziona come atteso quando si utilizza lo stesso tipo di Struct –