2013-09-26 49 views
0

好吧,我正在學習ruby,並且在教程中遇到了一些問題。我想知道你能否幫助我!Ruby中的類 - 創建將接受多個輸入的參數

看看下面的代碼:

class Dish 
def initialize(name, ingred, descrip) 
    @name = name 
    @ingred = ingred 
    @descrip = descrip 
end 
def name 
    @name 
end 
def name=(new_name) 
    @name = new_name 
end 
def ingred 
    @ingred 
end 
def ingred=(new_ingred) 
    @ingred = new_ingred 
end 
def descrip 
    @descrip 
end 
def descrip=(new_descrip) 
    @descrip = new_descrip 
end 
def display 
    puts "I am a #{@name} and my ingredient is #{@ingred} and my description is #{descrip}" 
    end 
end 
dis1 = Dish.new('Pizza', 'sauce', 'put sauce on that thing') 
dis1.display 

好了,所以這裏是我的問題,我希望我解釋的不夠好。到目前爲止,我已經學會了在創建類的新實例(即(名稱,粒度,描述))時輸入一個參數。我想知道的是,如果一道菜有多種配料,我會如何將它添加到我的班級?另外,如果我想要計算配料的數量或名稱的數量,我將如何做到這一點。我只是在學習關於課程的知識,而且我很難匹配Google提供的確切用詞。謝謝!

+0

我想到的第一個想法就是使配料成爲數組或散列對象。每個對象本身也可以是信息的集合,例如成分的名稱(如果它是散列的關鍵字),每份的含量等等。成分的數量就是'@ ingredients.size'。您也可以輕鬆添加或刪除配料。 – lurker

回答

0

使用數組。

class Dish 
    class Ingredient 
     attr_accessor :name, :description 

     def initialize(name, description) 
      @name = name 
      @description = description 
     end 

     def to_s 
      "#{name} - #{description}" 
     end 
    end 

    attr_accessor :name, :description, :ingredients 

    def initialize(name, description) 
     @name = name 
     @description = description 
     @ingredients = [] 
    end 

    def to_s 
     "#{name} - #{description}\n #{ingredients.join("\n").to_s}" 
    end 
end 

pizza = Dish.new("Pizza", "Italian style pizza") 
pizza.ingredients << Dish::Ingredient.new("Tomato Sauce", "Juicy Juicy Tomato Sauce.") 
pizza.ingredients << Dish::Ingredient.new("Cheese", "Cheese, duh.") 

puts pizza.to_s 
4

我會盡量回答你的一些問題。爲了簡化,我刪除了您的變量descrip及其相關方法。您看到我已將*放在ingredinitialize。這意味着在name之後傳遞可變數量的參數。這是處理你有關多種成分的問題的一種方式。這裏ingred是一個數組。由於@ingred設置爲ingred,@ingred也是一個數組。如果您查看各種方法以及調用時顯示的內容(顯示在底部),您應該能夠看到這是如何工作的。 (編輯,以添加一些功能,你可能需要在底部向下滾動。)

class Dish 
    def initialize(name, *ingred) 
    @name = name 
    @ingred = ingred 
    end 
    def name 
    @name 
    end 
    def name=(new_name) 
    @name = new_name 
    end 
    def ingred 
    @ingred 
    end 
    def ingred=(*ingred) 
    @ingred = ingred 
    end 
    def add_ingred(ingred) 
    @ingred << ingred 
    end 
    def remove_ingred(ingred) 
    @ingred.delete(ingred) 
    end 
    def nbr_ingred 
    @ingred.count 
    end 
end 

dis1 = Dish.new("Pizza", "sauce", "crust", "cheese", "anchovies") 
p dis1.ingred #=> ["sauce", "crust", "cheese", "anchovies"] 
dis1.add_ingred("olives") 
p dis1.ingred #=> ["sauce", "crust", "cheese", "anchovies", "olives"] 
dis1.add_ingred(["capers", "mushrooms"]) 
p dis1.ingred #=> ["sauce", "crust", "cheese", "anchovies", "olives", ["capers", "mushrooms"]] 
dis1.ingred.flatten! 
p dis1.ingred #=> ["sauce", "crust", "cheese", "anchovies", "olives", "capers", "mushrooms"] 
dis1.remove_ingred("anchovies") 
p dis1.ingred #=> ["sauce", "crust", "cheese", "olives", "capers", "mushrooms"] 
p dis1.nbr_ingred #=> 6 
dis1.ingred = "olives", "pineapple" # treated as ["olives", "pineapple"] 
p dis1.ingred #=> [["olives", "pineapple"]] 
dis1.ingred = ["cheese", "crust"] 
p dis1.ingred #=> [["olives", "pineapple"]] 
dis1.ingred.flatten! 
p dis1.ingred #=> ["olives", "pineapple"] 
+0

應該在簽名結尾處定義'splatted'參數嗎? – theTuxRacer

+0

取決於Ruby版本。從1.9開始,splat arg可以在任何地方;在此之前它必須是最後一個。 –

+0

接受方法如何找出哪些值是圖示,哪些不是?你有什麼資源可以閱讀來解決這個問題嗎? – theTuxRacer

0

由於兩個答案之前我也都離開了描述參數,我將stealCary Swoveland的答案,並添加記述參數:

class Dish 
    attr_accessor :name, :descrip 
    def initialize(name, *ingred, descrip) # Only in Ruby 1.9+ 
     @name = name 
     @ingred = *ingred 
     @descrip = descrip 
    end 
    def ingred 
    @ingred 
    end 
    def ingred=(*ingred) 
    @ingred = ingred 
    end 
    def add_ingred(ingred) 
    @ingred << ingred 
    end 
    def remove_ingred(ingred) 
    @ingred.delete(ingred) 
    end 
    def nbr_ingred 
    @ingred.count 
    end 
    def display 
     puts "I am a #{@name} and my ingredient is #{@ingred.join(', ')} and my description is #{descrip}" 
    end 
end 

dis1 = Dish.new('Pizza', 'sauce', 'ham', 'put ingredients on that thing.') 
dis1.add_ingred('fish') 
dis1.display #=> I am a Pizza and my ingredient is sauce, ham, fish and my description is put ingredients on that thing. 
+0

編輯回答會更好。 –

相關問題