2010-06-16 13 views
11

Gibt es einen eingebauten Weg oder eine elegantere Möglichkeit, eine Nummer Nummer auf obere/untere Grenzen in Ruby oder Rails einzuschränken?Eine Zahl auf obere/untere Grenzen beschränken?

z.B. so etwas wie:

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

Antwort

13

Hier ist ein kluger Weg, es zu tun:

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

Aber das ist nicht sehr gut lesbar . Wenn Sie es nur einmal tun müssen, würde ich nur tun

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

oder wenn Sie es mehrmals benötigen, das Modul Comparable-Affe Patch:

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

so können Sie es wie

verwenden

Sie könnten auch nur ruby facets erfordern, die eine Methode clip hinzufügt, die genau dies tut.

+0

Danke, ich könnte die Ruby Facets Route gehen. – Amy

12

Sie min und max verwenden kann, um den Code übersichtlicher zu machen:

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

Dies ist möglicherweise der schnellere Weg, es als die sort() Version unten zu tun. Vielen Dank. – Amy

0

Da Sie Rails erwähnen, werde ich erwähnen, wie dies mit einer Validierung zu tun ist.

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

Das wird die Nummer natürlich nicht automatisch anpassen.

1
class Range 

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

end 
Verwandte Themen