يتيح لك OpenStruct إنشاء كائن من Hash بسهولة.
فبدلًا من أن تضطر إلى الوصول عبر مفاتيح Hash، يتيح لنا OpenStruct استخدام الطُرق للوصول إلى القيم وضبطها.
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
من مزايا هذا الأسلوب أننا نستطيع الاستفادة من اختصار عند استخدام صيغة الكتل.
ففي الحالات التي تستدعي فيها الكتلة طريقة واحدة، يمكنك استبدال الكتلة بـ &: متبوعةً باسم الطريقة.
على سبيل المثال، هذان السطران مترادفان:
people.sum { |person| person.age }
people.sum(&:age)
كل الأصناف التي رأيتها في التمارين السابقة كانت جزءًا من المكتبة الأساسية في Ruby.
أما OpenStruct فهو جزء من المكتبة القياسية في Ruby (وكثيرًا ما تُختصر إلى "stdlib")، وهي مجموعة من الأصناف للتعامل مع أشياء مثل التواريخ وjson والشبكات.
كما توفر بعض الوظائف المفيدة التي تجعل التعامل مع الكود أسهل.
وعند استخدام أصناف ليست من المكتبة الأساسية، سواء كان الكود الخاص بك في ملفات مختلفة، أو أصنافًا من stdlib، أو تبعيات خارجية، نحتاج إلى استيرادها باستخدام الطريقة require قبل أن نتمكن من استخدامها.
على سبيل المثال:
require 'ostruct'
person = OpenStruct.new(name: "Jeremy Walker")
# ...
أنت تواصل العمل على نظام إدارة المخزون الذي بنيته سابقًا.
وبعد أن اكتشفت OpenStruct واختصارات الكتل، قررت إعادة هيكلة الكود قليلًا.
فبدلًا من تخزين العناصر كـ Hash، ستستفيد من مهاراتك الجديدة.
تريد أن تواصل استرجاع قائمة العناصر الموجودة في المخزون، لكن هذه المرة يجب أن تكون كائنات يمكن استدعاء الطُرق عليها.
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
أعد هيكلة item_names لتستخدم اختصار الكتل الجديد الذي تعلمته بدلًا من Hash.
وللتذكير، يجب أن تُرجع الطريقة ما يلي:
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
أعد هيكلة total_stock لتستخدم طريقة OpenStruct، بدلًا من الإشارة إلى Hash.
وللتذكير، يجب أن تُرجع الطريقة ما يلي:
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
سجّل في Exercism لتتعلّم وتتقن Ruby عبر 21 مفهومًا121 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.