我编写了以下代码,使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]
到目前为止,但我不确定它是否更具可读性。
答案 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