Az OpenStruct segítségével könnyedén létrehozhatsz egy objektumot egy Hash-ből.
Ahelyett, hogy Hash-kulcsokkal kellene elérnünk az értékeket, az OpenStruct metódusokkal teszi lehetővé azok elérését és beállítását.
attributes = { name: "Jeremy Walker", age: 21, location: "Nomadic" }
person = OpenStruct.new(attributes)
person.name
#=> Jeremy Walker
person.location
#=> Nomadic
# Update the age
person.age = 35
# It sets correctly
person.age
#=> 35
Ennek a megközelítésnek az egyik előnye, hogy a blokk szintaxis használatakor kihasználhatunk egy rövidítést.
Ha egy blokk csak egyetlen metódust hív meg, akkor a blokkot lecserélheted a &: jelre, amelyet a metódus neve követ.
Például ez a két sor ugyanazt jelenti:
people.sum { |person| person.age }
people.sum(&:age)
A korábbi feladatokban látott osztályok mind a Ruby Core könyvtárához tartoztak.
Az OpenStruct a Ruby Standard könyvtárának a része (ezt gyakran csak „stdlib” rövidítéssel emlegetik): olyan osztályok gyűjteménye, amelyek segítségével többek között dátumokkal, JSON-nal és hálózatkezeléssel dolgozhatsz. Emellett hasznos funkciókat is kínál, amelyekkel könnyebb dolgozni a kódoddal.
Ha olyan osztályokat használsz, amelyek nem a Core könyvtárból származnak (a saját kódod más fájlokban, a stdlibből származó osztályok vagy külső függőségek), akkor azokat a require metódussal kell importálnod, mielőtt használhatnád őket.
Például:
require 'ostruct'
person = OpenStruct.new(name: "Jeremy Walker")
# ...
Folytatod a korábban épített készletkezelő rendszer fejlesztését.
Mióta felfedezted az OpenStruct-ot és a blokk-rövidítéseket, úgy döntöttél, hogy kicsit refaktorálod a kódot.
Ahelyett, hogy hash-ekben tárolnád a tételeket, most az újonnan szerzett tudásodat fogod használni.
Továbbra is le szeretnéd kérni a raktárkészletben lévő tételek listáját, de ezúttal olyan objektumok legyenek, amelyeken metódusokat lehet meghívni.
inventory = BoutiqueInventory.new([
{price: 65.00, name: "Maxi Brown Dress", quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}},
{price: 50.00, name: "Red Short Skirt", quantity_by_size: {}},
{price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
{price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
])
inventory.items.first.name
# => "Maxi Brown Dress"
inventory.items.first.price
# => 65
inventory.items.size
# => 4
item_names refaktorálásaRefaktoráld az item_names metódust úgy, hogy a hash-ek helyett az újonnan tanult blokk-rövidítést használja.
Emlékeztetőül, a metódusnak ezt kell visszaadnia:
BoutiqueInventory.new([
{price: 65.00, name: "Maxi Brown Dress", quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}},
{price: 50.00, name: "Red Short Skirt", quantity_by_size: {}},
{price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
{price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
]).item_names
# => ["Bamboo Socks Cats", "Black Short Skirt", "Maxi Brown Dress", "Red Short Skirt"]
total_stock refaktorálásaRefaktoráld a total_stock metódust úgy, hogy hash-re való hivatkozás helyett az OpenStruct metódusát használja.
Emlékeztetőül, a metódusnak ezt kell visszaadnia:
BoutiqueInventory.new([
{price: 65.00, name: "Maxi Brown Dress", quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}},
{price: 50.00, name: "Red Short Skirt", quantity_by_size: {}},
{price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
{price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
]).total_stock
# => 36
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Ruby nyelvet 21 fogalom121 feladat segítségével, valódi emberi mentorálással, mindez ingyen.