如何改进此 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。还有什么替代方案?

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

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

最新更新