有没有一种限制/钳制数字的方法?

mb1*_*b14 26 ruby clamp

我写了以下代码,它保持x在范围内(a..b).在伪代码中:

(if x < a, x = a; if x > b, x = b)
Run Code Online (Sandbox Code Playgroud)

在Ruby中它将是这样的:

x = [a, [x, b].min].max
Run Code Online (Sandbox Code Playgroud)

由于它是非常基本和有用的功能,我想知道是否有一个本机方法在ruby中这样做.

从Ruby 2.3.3开始,显然没有这样的方法,最短/更易读的方法是什么?

我发现:

x = [a, x, b].sort[1]
Run Code Online (Sandbox Code Playgroud)

到目前为止,但我不确定它是否更具可读性.

Mar*_*une 38

Ruby 2.4.0介绍Comparable#clamp:

523.clamp(0, 100)        #=> 100
Run Code Online (Sandbox Code Playgroud)

  • 最好的部分:红宝石没有夹具方法的原因是他们不能停止争论什么命名功能. (13认同)
  • 哈哈,我实现了Comparable#clamp.花了他们足够长的时间来合并我的补丁... ;-) (2认同)

mb1*_*b14 34

我自己的答案:不

然而

x = [a, x, b].sort[1]
Run Code Online (Sandbox Code Playgroud)

是一个解决方案.

  • 不会说谎,那很性感. (15认同)
  • 我想这可能是我见过的唯一最漂亮的代码行. (3认同)
  • 很酷的是,你把min,max和x放在一起的顺序甚至都不重要. (2认同)

Zed*_*ddy 11

我这样做了:

class Numeric
  def clamp min, max
    [[self, max].min, min].max
  end
end
Run Code Online (Sandbox Code Playgroud)

所以每当我想要夹住任何东西时,我都可以打电话:

x.clamp(min, max)
Run Code Online (Sandbox Code Playgroud)

我发现它很可读.