2013-11-14 58 views
1

我想知道是否有一個更優雅的方式在Ruby中這樣說:如何改進這個Ruby case switch語句?

FREE_PLAN_MAXIMUM = 1 
BASIC_PLAN_MAXIMUM = 10 
PREMIUM_PLAN_MAXIMUM = 100 

def maximum_entries_per_month 
    case plan 
    when "premium" 
    PREMIUM_PLAN_MAXIMUM 
    when "basic" 
    BASIC_PLAN_MAXIMUM 
    else 
    FREE_PLAN_MAXIMUM 
    end 
end 

我不喜歡的premiumbasic函數內部的重複。什麼可能是另一種選擇?

+0

你看到的重複? – colinm

回答

3

這取決於你的代碼的其餘部分,特別是你是否在其他地方使用這些常量。不過,我發現一種很好的方式就是散列。

PLAN_MAXIMUMS = { free: 1, basic: 10, premium: 100 } 

def maximum_entries_per_month 
    PLAN_MAXIMUMS[plan.to_sym] || PLAN_MAXIMUMS[:free] 
end 
+1

['PLAN_MAXIMUMS.default = 1'](http://ruby-doc.org/core-2.0.0/Hash.html#method-i-default-3D),只是'PLAN_MAXIMUMS [plan.to_sym]'會也工作。 –

+0

謝謝。這正是我所期待的。 – Tintin81

0

怎麼樣:

FREE_PLAN_MAXIMUM = 1 
BASIC_PLAN_MAXIMUM = 10 
PREMIUM_PLAN_MAXIMUM = 100 
PLANS = {'premium' => PREMIUM_PLAN_MAXIMUM, 'basic' => BASIC_PLAN_MAXIMUM, 'free' => FREE_PLAN_MAXIMUM} 

def maximum_entries_per_month 
    PLANS[plan] or FREE_PLAN_MAXIMUM 
end 

是「或FREE_PLAN_MAXIMUM」會抓住任何計劃,這不是「溢價」,「基本」或「無」,如果你確定你只有這三個計劃只是刪除部分

編輯:這樣你保持你的其他常量工作

EDIT2:如果你不希望添加更多的常量,你一定計劃是其中之一,你可以這樣做:

def maximum_entries_per_month 
    self.class.const_get("#{plan.upcase}_PLAN_MAXIMUM") 
end 
+0

downvoted?爲什麼? :S – arieljuod

+0

非常感謝,我從中學到了很多。 – Tintin81

3

使用Hash#fetch,它允許默認值,而不是case語句。

PLAN_MAXIMUMS = { free: 1, basic: 10, premium: 100 } 

def maximum_entries_per_month 
    PLAN_MAXIMUMS.fetch(plan.to_sym, PLAN_MAXIMUMS[:free]) 
end 
+0

+1我以前從來沒有見過提取,但我也認爲我的天真「||」非常簡潔易讀 – spike

+0

非常感謝。由於我還是Rails的新手,因此我使用了spike的語法,因爲它更易於閱讀和理解。 – Tintin81

1

你不需要一種方法。只要有一個哈希:

maximum_entries_per_month = Hash.new(1).merge{"premium" => 100, "basic" => 10} 

,並呼籲:

maximum_entries_per_month[plan] 
+1

我即將發佈相同的東西 - 等待直到我拿到新的鍵盤。 –