问题
I wrote the following code, which keeps x
within the range (a..b)
. In pseudo code:
(if x < a, x = a; if x > b, x = b)
In Ruby it would be something like:
x = [a, [x, b].min].max
As it is quite basic and useful function, I was wondering if there is a native method to do that in ruby.
As of Ruby 2.3.3 there is apparently no method like this, what would be the shortest/more readable way to do it?
I found:
x = [a, x, b].sort[1]
so far, but I'm not sure if it is more readable.
回答1:
Ruby 2.4.0 introduces Comparable#clamp:
523.clamp(0, 100) #=> 100
回答2:
My own answer : NO
However
x = [a, x, b].sort[1]
Is a solution.
回答3:
I did this:
class Numeric
def clamp min, max
[[self, max].min, min].max
end
end
So whenever I want to clamp anything, I can just call:
x.clamp(min, max)
Which I find pretty readable.
回答4:
Here is my solution which borrows heavily from the actual implementation:
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
回答5:
The most appealing solution for now in my opinion is the sort option:
[min,x,max].sort[1]
When you don't mind monkey patching existing core classes. I think the range class is a good candidate for a clamp method
class Range
def clamp(v)
[min,v,max].sort[1]
end
end
(min..max).clamp(v)
Or the plain array object. I don't like this, because the clamp function only is correct for 3 element arrays
class Array
def clamp
sort[1]
end
end
You can call it like this:
[a,x,b].clamp
来源:https://stackoverflow.com/questions/12020787/is-there-a-method-to-limit-clamp-a-number