1

我想知道在 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什么可能是替代方案?

4

4 回答 4

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
于 2013-11-14T16:45:53.300 回答
3

这取决于您的其余代码,尤其是您是否在其他地方使用这些常量。不过,我发现对这种事情很好的一种模式是哈希。

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

def maximum_entries_per_month
  PLAN_MAXIMUMS[plan.to_sym] || PLAN_MAXIMUMS[:free]
end 
于 2013-11-14T16:38:40.787 回答
1

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

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

并致电:

maximum_entries_per_month[plan]
于 2013-11-14T17:10:38.647 回答
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
于 2013-11-14T16:45:31.267 回答