Ruby 是否有限制/钳制数字的方法?

Ruby 是否有限制/钳制数字的方法?,ruby,clamp,Ruby,Clamp,我编写了以下代码,它将x保持在(a..b)范围内。在伪代码中: (if x < a, x = a; if x > b, x = b) 由于它是一个非常基本和有用的函数,我想知道在ruby中是否有一个本地方法来实现它 对于Ruby 2.3.3,显然没有这样的方法,最短/可读性更好的方法是什么 我发现: x = [a, x, b].sort[1] 到目前为止,但我不确定它是否更具可读性。Ruby 2.4.0介绍: 我这样做: class Numeric def clamp min

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

(if x < a, x = a; if x > b, x = b)
由于它是一个非常基本和有用的函数,我想知道在ruby中是否有一个本地方法来实现它

对于Ruby 2.3.3,显然没有这样的方法,最短/可读性更好的方法是什么

我发现:

x = [a, x, b].sort[1]
到目前为止,但我不确定它是否更具可读性。

Ruby 2.4.0介绍:

我这样做:

class Numeric
  def clamp min, max
    [[self, max].min, min].max
  end
end
因此,每当我想夹紧任何东西时,我可以打电话:

x.clamp(min, max)
我觉得这很有可读性。

我自己的答案是:不

然而

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

是一个解决方案。

在我看来,目前最吸引人的解决方案是排序选项:

[min,x,max].sort[1] 
当您不介意对现有核心类进行修补时。 我认为range类是钳制方法的一个很好的候选者

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

以下是我的解决方案,它大量借鉴了实际实现:

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
除非定义了可比较的方法?:夹紧
模块可比
def夹最小值,最大值

如果max minmax?麦克斯:这只是一个有趣的问题,从完全的本机函数开始?你已经回答了你自己的问题-排序函数的使用很好。我认为你的可读性不会比这强多少。你的意思可能是:
x2=[a[x,b].min].max
。在我看来还可以,使用基本的泛型方法来构建其余的。。使整个事情独立于秩序。@tokland:你说得对。我编辑了它最好的部分:ruby没有clamp方法的原因是他们无法停止争论函数的名称。现在终于添加了这个。哈哈,我实现了Comparable#clamp。花了他们足够长的时间来合并我的补丁…;-)我不想撒谎,这很性感。我想这可能是我见过的最漂亮的代码行。最酷的是,你把最小值、最大值和x的顺序都不重要。在数组或范围上调用clamp似乎真的很欺骗人。这不是一个有人会想到的结果。猴子补丁数字或类似的东西看起来更容易理解IMHO。
[a,x,b].clamp
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