Innan vi går djupare in i konverteringsprocessen, låt oss alla först identifiera skillnaden mellan de två - hashen och strukturen. Detta kommer att låta oss hjälpa till att svara på frågan varför vissa föredrar att använda struct än hash i Ruby.
Att skilja Hash från Struct
Hash är samlingen av nyckel-värdeparen och det är samma sak med Arrayen, förutom det faktum att indexeringen gjordes genom godtyckliga nycklar för alla typer av objekt (inte heltalsindexet). En ordning där man korsar en hash efter värde eller nyckel kan tyckas godtycklig – och i allmänhet inte vara i korsningsordningen. Å andra sidan är struct den mer bekväma typen av sätt att bunta samman antalet attribut. Detta är genom åtkomstmetoderna utan att behöva skriva explicita klasser.
Struct gör att en instans kan genereras med en uppsättning accessorer och det ser kraftfullt och bekvämt ut för användaren. Även om hasch kan göra liknande saker, är det en kupp med några fallgropar, som du kanske inte gillar. Struktur är lättare att förstå, vilket kommer att leda användarna till en mer underhållbar kodning. Dessutom är det värt att notera att struct överträffar hash när det gäller datahämtningshastighet, vilket låter dig veta att struct kan vara ett bättre val jämfört med hash för konfigurationen som behöver nås på ett upprepat sätt under körningen.
Konvertera Hash till Struct i Ruby
Med det faktum att vi vet om de två kanske många föredrar att använda struct snarare än hash. Men vad vi vill fokusera här är att bakom den låga prestanda som ges av hash, kan de fortfarande bli fördelaktiga. Om du inte kan använda den på sin egen lilla väg, konvertera den till struktur så att bättre användbarhet kan uppnås.
Om du redan har definierat strukturen och du ville initiera konvertering av hash till struktur, kan vi hjälpa dig genom att använda följande metoder i ett givet exempel nedan. Om du ville konvertera har till en struct i Ruby, låt oss till exempel säga att vi har en given av:
h = { :a => 1, :b => 2 } och vill ha en struktur som: sa == 1 sb == 2
För att konvertera kan du göra någon av dessa metoder:
Konverteringsmetod 1:
På den här metoden kommer resultatet att se ut som OpenStruct och inte specifikt som struktur:
pry(main)> require 'ostruct' pry(main)> s = OpenStruct.new(h) => # pry(main)> sätter sa, sb 1 2
Konverteringsmetod 2:
Om du redan har definierat struct och vill starta något med en hash kan du följa detta:
Person = Struct.new(:first_name, :last_name, :age) person_hash = { first_name: "Foo", efternamn: "Bar", ålder: 29 } person = Person.new(*person_hash.values_at(*Person.members) ) => #
Konverteringsmetod 3:
Eftersom hash-nyckelordningen var garanterad i Ruby 1.9+ kan du följa detta:
s = Struct.new(*(k = h.keys)).new(*h.values_at(*k))
Exemplet med hash to struct-konvertering som vi gav kan hjälpa, men om du vill ha en mer omfattande idé, kom till proffs för formell hjälp.