如何改进这个Ruby case switch语句?

时间:2013-11-14 16:34:09

标签: ruby

我想知道在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

我不喜欢在函数内重复premiumbasic。什么可能是另类?

4 个答案:

答案 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