مسیرها
/
Ruby
Ruby
/
تمرین‌ها
/
موجودی بوتیک
موجودی بوتیک

موجودی بوتیک

تمرین یادگیری

مقدمه

روش‌های بیشتر برای پیمایش

در «شمارش پرنده»، با روش‌های پیمایش 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}
  },
  { ... }
]

1. فهرستی از اسم عنصرها را برگردانید

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"]

2. عنصرهایی را که ارزان هستند برگردانید

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}}
#    ]

3. عنصرهایی را که ناموجود هستند برگردانید

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: {}}]

4. موجودی یک عنصر را برگردانید

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}

5. موجودی کل را برگردانید

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
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Ruby Exercism

آماده‌اید موجودی بوتیک را شروع کنید؟

در Exercism ثبت‌نام کنید تا Ruby را همراه با 21 مفهوم121 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.