Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果值超出范围,则返回最小/最大值的Ruby优雅方法_Ruby - Fatal编程技术网

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

如果值超出范围,则返回最小/最大值的Ruby优雅方法,ruby,Ruby,因此,我正在编写一个程序来模拟一个过程,并需要计算费用。其逻辑是,如果费用金额小于最小值,则使用最小值;如果费用金额大于最大值,则使用最大值 我当然可以在多行上实现这一点,但我很想知道在Ruby中是否有更优雅的方法来实现这一点 fee_amount = <whatever logic I need> if fee_amount < min return min if fee_amount > max return max return fee_amount 费用金额=

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

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

fee_amount = <whatever logic I need>
if fee_amount < min return min
if fee_amount > max return max
return fee_amount
费用金额=
如果费用金额最大回报最大
退货费金额
在一行代码中没有优雅的方法可以做到这一点;如果在一行代码中塞进那么多的逻辑,那么这就不那么优雅了

您的现有代码可以通过以下方式进行大量清理:

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
fee\u amount=if-fee\u amountmax-then-max-else-fee\u amount结束

使用后缀条件,这将非常符合ruby风格

return min if fee_amount < min
return max if fee_amount > max
fee_amount
如果费用金额最大值,则返回最大值
费用金额

如果您正在寻找不那么难看(或至少不太短)的单衬里:

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

绝对不是鲁比主义,因为乍一看发生的事情并不直观。

如果只是一次,我会推荐肖恩·巴莱斯特拉奇的答案,这是最漂亮的

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

module Comparable
  def at_least other; self < other ? other : self end
  def at_most other; self > other ? other : self end
end
模块比较
def_至少其他;自我<他人?其他:自结束
def至少是其他的;自我>他人?其他:自结束
结束
我是这样使用它的:

fee_amount = <whatever logic I need>.at_least(min).at_most(max)
费用金额=.至少(最小值).最多(最大值)

这里有一条简短的单行线:

[min,fee_amount,max].sort[1]
 [[min, fee_amount].max, max].min
您应该用一个描述性名称将其包装在方法中,我的想法是:

 def limit_by_range(value, min, max)
   [[min, value].max, max].min
 end
n=(n=min)?n:(n
添加了一点通用的Ruby 2.4,它正好做到了这一点

# 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
fee_amount.clamp(min, max)

这的确是一种有趣的方法。它以杂种狗的方式很可爱。:-)它是最优雅、最美丽的。它很聪明,但并不美丽。这是一种非常横向的方式来表达期望的结果,我希望在生产代码中永远不会遇到它,除非它是一个方法的一行实现,它的名称告诉我它是做什么的。@sawa为了将两行挤成一行而将三个项放入一个数组并对其进行排序,并没有什么优雅或美丽的地方。如果你认为这是一个好主意,我无法想象维护你的代码会有多么困难。我同意,在一行代码中完成它是令人厌烦的。我试过这么做,或者做过很多类似的事情,现在我已经知道,分开的行有时比一行好得多。结构化三元语句在C或Perl中是可以接受的,但它们不是Ruby的方式;self.least(range.first)。至多(range.last);结束
为什么不直接使用
fee\u amount.constraint!(min,max)或类似的,如果你要考虑“把它变成一个函数调用”和使它成为一个线性函数一样,有时,你只想限制最小值或最大值,所以单独使用这些方法有更大的灵活性。更具可读性。另外,如果你有一个一次接受两个参数的方法,那么很可能不清楚哪个参数是哪个参数。给你的答案添加一些解释。对不起,这是我的第一篇文章:)