我想知道在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
。还有什么替代方案?
这取决于代码的其余部分,尤其是您是否在其他地方使用这些常量。不过,我发现这种事情的一个很好的模式是哈希。
PLAN_MAXIMUMS = { free: 1, basic: 10, premium: 100 }
def maximum_entries_per_month
PLAN_MAXIMUMS[plan.to_sym] || PLAN_MAXIMUMS[:free]
end
使用 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
你不需要方法。只需有一个哈希值:
maximum_entries_per_month = Hash.new(1).merge{"premium" => 100, "basic" => 10}
并致电:
maximum_entries_per_month[plan]
呢:
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