المسارات
/
Ruby
Ruby
/
التمارين
/
مخزون المتجر
مخزون المتجر

مخزون المتجر

تمرين تعلّمي

مقدمة

المزيد من طرق التعداد

في Bird Count، تعرّفت على طرق التعداد 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

تعداد كائنات 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"]

التعداد المتداخل

يمكنك أيضًا التعداد داخل كتل متداخلة، وربط الطرق بعضها ببعض. على سبيل المثال، إذا كانت لدينا مصفوفة من كائنات Hash لحيوانات، وأردنا استخراج الحيوانات ذات الأسماء القصيرة، فقد نكتب شيئًا كالتالي:

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

التعليمات

أنت تدير متجر أزياء على الإنترنت. اقترب موعد تخفيضاتك السنوية الكبرى، لذلك تريد إنشاء بعض الوظائف التي تساعدك على جرد مخزونك والتأكد من أنك مستعد.

يُمثَّل كل عنصر في المخزون بقيمة hash، والمخزون بأكمله مصفوفة من هذه الـ hash.

[
  {
    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، التي يجب أن تُرجع العناصر التي يقل سعرها عن 30 دولارًا.

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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.