2016-07-06 5 views
0

У меня есть класс Shop, и я хочу добавить сразу несколько элементов. Я хочу это:Ruby, добавляя сразу несколько объектов к массиву

shop1 = Shop.new 
product1 = Product.new("Dress", 50) 
shop1.add_products(product1, 5) 

добавить 5 платьев на склад

def add(product, qty) 
    @products << product * qty 
end 

так позже я могу использовать

@products.select{|p| p.name == "Dress"}.count 

и получить 5. Возможно ли это?

+0

Будьте осторожны: если вы делаете '[item] * 3', вы получаете массив из трех ссылок на один и тот же элемент, а не на три элемента. Изменение любого из них повлияет на все элементы массива. –

ответ

3

Самый простой способ я думаю:

def add(product, qty) 
    @products += [product] * qty 
end 

Но все это сводится к вашему синтаксические предпочтения.

+0

Разница с версией 'concat' заключается в том, что она создает новый массив вместо добавления к существующему. Они оба действительные способы сделать это. Я сделал редактирование на месте, потому что это то, что сделал OP. –

3

Вы могли бы сделать что-то вроде этого

def add(product, qty) 
    @products.concat([product] * qty) 
end 

или менее "умный"

def add(product, qty) 
    qty.times { @products << product } 
end 
1

Оба предыдущих ответа решают вашу проблему. Однако, возможно, вам стоит рассмотреть использование хэша вместо массива.

Что-то вроде этого:

class Product  
    @@products = Hash.new(0) 

    def initialize(product, qty) 
    @@products[product] = qty 
    end 

    def increase_stock(product, qty) 
    @@products[product] += qty 
    end 

    def decrease_stock(product, qty) 
    @@products[product] -= qty 
    end 

    def count_stock(product) 
    @@products[product] 
    end 
end 

p = Product.new('Dress',5) 
p.count_stock('Dress') 
=> 5 
p.increase_stock('Dress',10) 
p.count_stock('Dress') 
=> 15 
p.decrease_stock('Dress',2) 
p.count_stock('Dress') 
=> 13 

В моем GitHub, есть simple command-line inventory management app written in Ruby. Может быть полезно.

Смежные вопросы