有限制/钳位数字的方法吗?

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

 (if x  b, x = b) 

在Ruby中它将是这样的:

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

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

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

我发现:

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

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

Ruby 2.4.0引入了Comparable#clamp

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

我自己的答案:不

然而

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

是一个解决方案。

我这样做了:

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

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

 x.clamp(min, max) 

我发现它很可读。

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

 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,x,max].sort[1] 

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

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

或者是普通的数组对象。 我不喜欢这个,因为钳位function仅适用于3个元素arrays

 class Array def clamp sort[1] end end 

你可以这样称呼它:

 [a,x,b].clamp