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 و میانبرهای بلوک را کشف کردهاید، تصمیم گرفتهاید کد را کمی بازنویسی کنید.
بهجای ذخیره کردن عناصر بهصورت هش، از مهارتهای تازهی خود استفاده میکنید.
میخواهید همچنان فهرست عناصر موجود در انبار را بازیابی کنید، اما این بار آنها باید اشیایی باشند که بتوان متدهایی را رویشان فراخوانی کرد.
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 را بازنویسی کنید تا بهجای هشها از میانبر بلوک تازهای که یاد گرفتهاید استفاده کند.
یادآوری: متد باید این را برگرداند:
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 استفاده کند، نه از ارجاع به یک هش.
یادآوری: متد باید این را برگرداند:
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