2010-06-16 11 views
11

¿Hay un modo integrado o una forma más elegante de restringir un número num a límites superiores/inferiores en Ruby o en Rails?Restringir un número a límites superiores/inferiores?

p. Ej. algo así como:

def number_bounded (num, lower_bound, upper_bound) 
    return lower_bound if num < lower_bound 
    return upper_bound if num > upper_bound 
    num 
end 

Respuesta

13

He aquí una forma inteligente de hacerlo:

[lower_bound, num, upper_bound].sort[1] 

Pero eso no es muy legible . Si sólo tiene que hacerlo una vez, me acaba de hacer

num < lower_bound ? lower_bound : (num > upper_bound ? upper_bound : num) 

o si lo necesita varias veces, mono-parchear el módulo Comparable:

module Comparable 
    def bound(range) 
    return range.first if self < range.first 
    return range.last if self > range.last 
    self 
    end 
end 

para que pueda usarlo como

num.bound(lower_bound..upper_bound) 

También podría requerir ruby facets, que agrega un método clip que hace justamente esto.

+0

Gracias, podría ir a la ruta Ruby Facets. – Amy

12

Puede utilizar valores mínimo y máximo para hacer el código más conciso:

number_bounded = [lower_bound, [upper_bound, num].min].max 
+0

Posiblemente esta sea la forma más rápida de hacerlo que la versión de ordenación() a continuación. Gracias. – Amy

0

Como mencionas Rails, mencionaré cómo hacerlo con una validación.

validates_inclusion_of :the_column, :in => 5..10 

Eso no ajustará automáticamente el número, por supuesto.

1
class Range 

    def clip(n) 
    if cover?(n) 
     n 
    elsif n < min 
     min 
    else 
     max 
    end 
    end 

end 
Cuestiones relacionadas