實際上有4種常用的方法將參數傳遞給函數。 你的第一個例子是最常見的例子,但是你害怕做出了一個糟糕的例子。您的數量始終是8,所以如果是多餘的,也沒有使用,因此也多餘 的parametere價格這將是相同以下
def order_food price
"8 large Burgers, coming right up!"
end
但是,這是不是你的目的我相信。
所以,這會是這樣 第一種方法的東西
def order_food1(size, quantity, price)
extra = quantity == 1 ? :salad : :Burgers
cost = quantity * price
"#{quantity} #{size} #{extra}, coming right up! Thats is #{cost} dollar please"
end
+快(見基準)
+每個人都使用它,瞭解它在一個糖霜
- 你要知道它們所定義的參數和順序,你需要閱讀的不太常見的應用方法的API
- 你必須提供所有的參數
下一頁:使用可選參數使用默認值
def order_food2(size = "large", quantity = 1, price = 4)
extra = quantity == 1 ? :salad : :Burgers
cost = quantity * price
"#{quantity} #{size} #{extra}, coming right up! Thats is #{cost} dollar please"
end
+還廣泛應用於
+沒有必要,如果他們是在默認的使用參數
- 你還需要知道的參數的順序和意義,如果最後使用你需要他們所有
下一頁:使用哈希作爲參數
def order_food3(opts = {})
opts = {size: :large, quantity: 1, price: 4}.merge!(opts)
extra = opts[:quantity] == 1 ? :salad : :Burgers
cost = opts[:quantity] * opts[:price]
"#{opts[:quantity]} #{opts[:size]} #{extra}, coming right up! Thats is #{cost} dollar please"
end
- 少用,你的方法自己是有點難以閱讀
- 慢
+不需要知道參數你不不需要,也沒有訂單
+該方法的使用更具可讀性
下一頁:以前的方法
def order_food4(size: :large, quantity: 1, price: 4)
extra = :quantity == 1 ? :salad : :Burgers
cost = quantity * price
"#{quantity} #{size} #{extra}, coming right up! Thats is #{cost} dollar please"
end
的簡化版本 - 慢
+方法本身和使用它的可讀性更強
哪一個更好?取決於個人的品味和情況。 我使用所有的人,並沒有什麼設計指南,據我知道,prefares一方或另一方。在實踐中,你甚至會將其中的一些組合起來。那些很少改變 參數,最好給出一個默認值,反之亦然。 的方法是所謂多次(如遞歸的)能夠從更快,更少的內存消耗方法1. 在我看來受益,可讀性是一個Ruby腳本最重要的,所以如果有很多的參數和使用feasable方法3或4
使用和標準的一些例子..
puts order_food1("large", 3, 4)
puts order_food2("large", 3, 4)
puts order_food3(size: "large", quantity: 3, price: 4)
puts order_food3
puts order_food4(size: "large", quantity: 3, price: 4)
puts order_food4
# 3 large Burgers, coming right up! Thats is 12 dollar please
# 3 large Burgers, coming right up! Thats is 12 dollar please
# 3 large Burgers, coming right up! Thats is 12 dollar please
# 1 large salad, coming right up! Thats is 4 dollar please
# 3 large Burgers, coming right up! Thats is 12 dollar please
# 1 large Burgers, coming right up! Thats is 4 dollar please
require 'benchmark'
Benchmark.bmbm do |x|
x.report("order_food1 ") { 10000.times { order_food1("large", 3, 12) }}
x.report("order_food2 ") { 10000.times { order_food2("large", 3, 12) }} # all parameters given
x.report("order_food2_def") { 10000.times { order_food2 }} # using default parameters
x.report("order_food3 ") { 10000.times { order_food3(size: "large", quantity: 3, price: 12) }} # all parameters given
x.report("order_food3 def") { 10000.times { order_food3 }} # using default parameters
x.report("order_food4 ") { 10000.times { order_food3(size: "large", quantity: 3, price: 12) }} # all parameters given
x.report("order_food4 def") { 10000.times { order_food3 }} # using default parameters
end
# user system total real
# order_food1 0.015000 0.000000 0.015000 ( 0.010420)
# order_food2 0.000000 0.000000 0.000000 ( 0.010675)
# order_food2_def 0.016000 0.000000 0.016000 ( 0.011007)
# order_food3 0.015000 0.000000 0.015000 ( 0.020182)
# order_food3 def 0.016000 0.000000 0.016000 ( 0.016954)
# order_food4 0.015000 0.000000 0.015000 ( 0.020256)
# order_food4 def 0.000000 0.000000 0.000000 ( 0.016968)
'size'和'quantity'不是實例變量。這將是'@ size'和'@ quantity'。 – Schwern
完全混合,改變了。由於@Schwern – ekeith
什麼是您的兩個方法'price'參數的目的是什麼? –