2016-07-06 108 views
0

我有Shop類,我想一次添加多個項目。 我想這一點:紅寶石,一次添加多個對象到一個數組

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。可能是有用的..