如果值超出范围,Ruby优雅方式返回最小值/最大值

所以我正在编写一个程序来建模过程并需要计算费用。 逻辑是,如果费用金额小于最小值,则使用最小值,如果费用金额大于最大值则使用最大值。

我当然可以在多行上实现这一点,但有兴趣知道在Ruby中是否有更优雅的方法来实现这一点。

fee_amount =  if fee_amount  max return max return fee_amount 

如果只是一次,我会推荐Shawn Balestracci的答案,这是最美丽的。

另外,以下是我个人图书馆的一些方法:

 module Comparable def at_least other; self < other ? other : self end def at_most other; self > other ? other : self end end 

我这样使用它:

 fee_amount = .at_least(min).at_most(max) 

如果你正在寻找一个不那么丑陋(或至少是短暂的)单线:

 [min,fee_amount,max].sort[1] 

绝对不是Rubyish,因为乍一看发生的事情并不直观。

使用后缀条件,这将是ruby风格。

 return min if fee_amount < min return max if fee_amount > max fee_amount 

这是一个简短的单行:

  [[min, fee_amount].max, max].min 

你应该将它包装在一个带有描述性名称的方法中,我的想法是:

  def limit_by_range(value, min, max) [[min, value].max, max].min end 

在一条线上没有优雅的方式做到这一点; 通过将这么多逻辑塞进一行代码中,你就不会那么优雅。

您现有的代码可以大大清理:

 fee_amount =  fee_amount = min if fee_amount < min fee_amount = max if fee_amount > max 

对比这个非常难看的单线……

 fee_amount = if fee_amount < min then min elsif fee_amount > max then max else fee_amount end 
 n = (n <= max || n >= min) ? n : (n < min ? min : max) 

有点通用

 # stabby lambda function: map = ->(val, min, max) { [min, val, max].sort[1] } # call stabby function: map.call(2.5, 1, 3) => 2.5 # or shorter: map[2.5, 1, 3] => 2.5