3

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

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

fee_amount = <whatever logic I need>
if fee_amount < min return min
if fee_amount > max return max
return fee_amount
4

8 回答 8

10

如果您正在寻找不那么丑陋(或至少短)的单线:

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

绝对不是 Rubyish,因为乍一看并不直观。

于 2013-04-24T17:27:31.067 回答
6

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

或者,以下是我个人库中的一些方法:

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

我这样使用它:

fee_amount = <whatever logic I need>.at_least(min).at_most(max)
于 2013-04-24T17:58:55.077 回答
6

Ruby 2.4 添加的Comparable#clamp正是这样做的

fee_amount.clamp(min, max)

https://blog.bigbinary.com/2016/12/13/ruby-2-4-adds-comparable-clamp-method.html

于 2019-01-09T14:50:29.147 回答
4

使用后缀条件,这将是非常红宝石风格。

return min if fee_amount < min
return max if fee_amount > max
fee_amount
于 2013-04-24T17:22:57.630 回答
2

这是一个简短的单行:

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

我的想法是,您应该将其包装在一个具有描述性名称的方法中:

 def limit_by_range(value, min, max)
   [[min, value].max, max].min
 end
于 2013-04-24T19:59:24.430 回答
1
n = (n <= max || n >= min) ? n : (n < min ? min : max)

有点通用

于 2013-04-25T09:20:20.870 回答
1

没有一种优雅的方式可以在一行中做到这一点。通过将这么多逻辑塞进一行代码,你会变得不那么优雅。

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

fee_amount = <logic>
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
于 2013-04-24T17:22:44.970 回答
0
# 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
于 2017-03-31T03:53:14.160 回答