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

时间:2012-08-18 17:37:53

标签: ruby clamp

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

(if x < a, x = a; if x > b, x = b)

在Ruby中,它将类似于:

x = [a, [x, b].min].max

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

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

我找到了:

x = [a, x, b].sort[1]

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

5 个答案:

答案 0 :(得分:37)

Ruby 2.4.0引入了Comparable#clamp

523.clamp(0, 100)        #=> 100

答案 1 :(得分:33)

我自己的回答:没有

然而

x = [a, x, b].sort[1]

是解决方案。

答案 2 :(得分:10)

我这样做了:

class Numeric
  def clamp min, max
    [[self, max].min, min].max
  end
end

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

x.clamp(min, max)

我发现它非常易读。

答案 3 :(得分:0)

这是我的解决方案,它从实际实施中大量借鉴:

unless Comparable.method_defined? :clamp
  module Comparable
    def clamp min, max
      if max-min<0
        raise ArgumentError, 'min argument must be smaller than max argument'
      end
      self>max ? max : self<min ? min : self
    end
  end
end

答案 4 :(得分:-1)

我认为目前最吸引人的解决方案是排序选项:

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

当你不介意猴子修补现有的核心课程时。 我认为范围类是钳位方法的一个很好的候选者

class Range
  def clamp(v)
    [min,v,max].sort[1]
  end
end

(min..max).clamp(v)

或普通数组对象。我不喜欢这样,因为钳位功能仅适用于3个元素阵列

class Array
    def clamp
      sort[1]
    end
end

您可以这样称呼它:

[a,x,b].clamp