我编写了以下代码,它将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]
到目前为止,但我不确定它是否更易读。
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 ? min : self
end
end
end
在我看来,目前最吸引人的解决方案是排序选项:
[min,x,max].sort[1]
当您不介意猴子补丁现有的核心类时。 我认为范围类是一个很好的候选者,可以使用夹紧方法
class Range
def clamp(v)
[min,v,max].sort[1]
end
end
(min..max).clamp(v)
或者普通的数组对象。我不喜欢这个,因为clamp函数仅适用于三个元素的数组。
class Array
def clamp
sort[1]
end
end
你可以这样调用:
[a,x,b].clamp
x2 = [a,[x,b].min] .max
。在我的看法中它看起来不错,使用基本通用方法来构建其余部分。 - tokland