در «شمارش پرنده»، با روشهای پیمایش count، any?، select، all? و map آشنا شدید. در ادامه مروری بر آنها داریم، همراه با چند مورد اضافه:
fibonacci = [0, 1, 1, 2, 3, 5, 8, 13]
fibonacci.count { |number| number == 1 } #=> 2
fibonacci.any? { |number| number > 20 } #=> false
fibonacci.none? { |number| number > 20 } #=> true
fibonacci.select { |number| number.odd? } #=> [1, 1, 3, 5, 13]
fibonacci.all? { |number| number < 20 } #=> true
fibonacci.map { |number| number * 2 } #=> [0, 2, 2, 4, 6, 10, 16, 26]
fibonacci.select { |number| number >= 5 } #=> [5, 8, 13]
fibonacci.find { |number| number >= 6 } #=> 8
# Some methods work with or without a block
fibonacci.sum #=> 33
fibonacci.sum { |number| number * number } #=> 273
# There are also methods to help with nested arrays:
animals = [ ['cat', 'bob'], ['horse', 'caris'], ['mouse', 'arya'] ]
animals.flatten #=> ["cat", "bob", "horse", "caris", "mouse", "arya"]
پیمایش اشیای Hash دقیقاً مثل پیمایش اشیای Array است، با این تفاوت که بلوک دو آرگومان دریافت میکند، کلید و مقدار:
pet_names = {cat: "bob", horse: "caris", mouse: "arya"}
pet_names.each { |animal, name| ... }
اگر فقط به یکی از مقدارها نیاز داشته باشید، میتوانید از نماد ویژهی _ استفاده کنید تا نشان دهید که به یک مقدار نیازی نیست. این کار هم کد را برای برنامهنویس واضحتر میکند و هم یک بهینهسازی عملکرد است.
pet_names = {cat: "bob", horse: "caris", mouse: "arya"}
pet_names.map { |_, name| name } #=> ["bob", "caris", "arya"]
میتوانید در بلوکهای تودرتو هم پیمایش کنید و متدها را زنجیروار پشت سر هم بچینید. برای مثال، اگر آرایهای از هشهای حیوانات داشته باشیم و بخواهیم حیواناتی را که اسمهای کوتاه دارند استخراج کنیم، ممکن است بخواهیم کاری شبیه این انجام دهیم:
pets = [
{ animal: "cats", names: ["bob", "fred", "sandra"] },
{ animal: "horses", names: ["caris", "black beard", "speedy"] },
{ animal: "mice", names: ["arya", "jerry"] }
]
pets.map { |pet|
pet[:names].select { |name| name.length <= 5 }
}.flatten.sort
#=> ["arya", "bob", "caris", "fred", "jerry"]
شما یک بوتیک مد آنلاین را اداره میکنید. فروش بزرگ سالانهتان نزدیک است، بنابراین میخواهید قابلیتهایی بسازید تا به شما کمک کند موجودی انبارتان را بررسی کنید و مطمئن شوید که آمادهاید.
هر عنصر از موجودی با یک هش نمایش داده میشود و کل موجودی آرایهای از این هشها است.
[
{
name: "White Shirt",
price: 40,
quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}
},
{ ... }
]
BoutiqueInventory.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"]
BoutiqueInventory.cheap را پیادهسازی کنید؛ این متد باید هر عنصری را که کمتر از ۳۰ دلار قیمت دارد برگرداند.
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}}
]).cheap
# => [
# {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}}
# ]
BoutiqueInventory.out_of_stock را پیادهسازی کنید؛ این متد باید هر عنصری را که موجودی ندارد برگرداند (یعنی quantity_by_size آن خالی است).
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}}
]).out_of_stock
#=> [{price: 50.00, name: "Red Short Skirt", quantity_by_size: {}}]
BoutiqueInventory.stock_for_item(name) را پیادهسازی کنید تا موجودی یک عنصر را با اسمش برگردانید:
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}}
]).stock_for_item("Black Short Skirt")
#=> {s: 1, xl: 4}
BoutiqueInventory.total_stock را پیادهسازی کنید تا مقدار کل عنصرهای انبارتان را محاسبه کنید:
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