2010-06-16 15 views
11

Esiste un modo incorporato o un modo più elegante per limitare un numero num ai limiti superiore/inferiore in Ruby o in Rails?Limita un numero ai limiti superiore/inferiore?

ad es. qualcosa di simile:

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

risposta

13

Ecco un modo intelligente per farlo:

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

Ma non è molto leggibile . Se avete solo bisogno di farlo una volta, vorrei solo fare

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

o se ne avete bisogno più volte, scimmia-patch modulo comparable:

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

in modo da poter utilizzare come

num.bound(lower_bound..upper_bound) 

Si potrebbe anche solo richiedere ruby facets, che aggiunge un metodo clip che fa proprio questo.

+0

Grazie, potrei andare al percorso Ruby Facets. – Amy

12

È possibile utilizzare min e max per rendere il codice più conciso:

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

Questo è probabilmente il modo più veloce per farlo rispetto alla versione sort() di seguito. Grazie. – Amy

0

Dato che stai citando Rails, ti dirò come farlo con una convalida.

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

Questo non consente di regolare automaticamente il numero, ovviamente.

1
class Range 

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

end 
Problemi correlati