我想知道在Ruby中是否有更优雅的方式来说这个:
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
我不喜欢在函数内重复premium
和basic
。什么可能是另类?
答案 0 :(得分:3)
这取决于您的其余代码,尤其是您是否在其他地方使用这些常量。我发现这种东西很好的一种模式是哈希。
PLAN_MAXIMUMS = { free: 1, basic: 10, premium: 100 }
def maximum_entries_per_month
PLAN_MAXIMUMS[plan.to_sym] || PLAN_MAXIMUMS[:free]
end
答案 1 :(得分: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
答案 2 :(得分:1)
您不需要方法。哈哈哈:
maximum_entries_per_month = Hash.new(1).merge{"premium" => 100, "basic" => 10}
并致电:
maximum_entries_per_month[plan]
答案 3 :(得分: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"会抓住任何不是" premium"," basic"或者"免费",如果你确定你只有那三个计划只是删除那部分
编辑:这样可以保持其他常量正常工作EDIT2:如果您不想添加更多常量,并且您确定计划就是其中之一,那么您可以这样做:
def maximum_entries_per_month
self.class.const_get("#{plan.upcase}_PLAN_MAXIMUM")
end