2015-02-01 16 views
5

Ich möchte in der Lage sein, eine Range erstellen und dann testen, ob eine Variable in diesem Bereich enthalten ist. Etwas, das wie folgt aussieht:Wie kann ich testen, ob ein Wert innerhalb eines Bereichs liegt?

fn main() { 
    let a = 3..5; 
    assert!(a.contains(4)); 
} 

Im Moment ist die einzige offensichtliche Sache, die ich sehe, ist Iterator::any zu verwenden. Das ist hässlich, weil sie eine O (1) Betrieb nehmen und machen es O (n):

fn main() { 
    let mut a = 3..5; 
    assert!(a.any(|v: i32| v == 4)); 
} 
+0

Ich habe eine Kiste ('range_check'), die' Contains' und 'Within' Merkmale dafür liefert. –

Antwort

4

Es gibt nichts auf Range selbst (derzeit jedenfalls), aber es ist nicht schwer, dies zu tun; Schließlich braucht es nur ein paar Vergleiche:

4 >= a.start && 4 < a.end 
+0

Glaubst du, dass ein PR, um dies hinzuzufügen (zu allen 'Range *' structs), willkommen wäre? – Shepmaster

+2

Nicht ohne RFC. Ehrlich gesagt, ist eine unwesentliche Feature-Erweiterung vor 1.0 unwahrscheinlich. Das heißt, ein RFC ist relativ einfach zu schreiben. – bluss

+0

Was ist mit negativen Zahlen? – mkirk

0

In einigen weiteren Versionen wird der ursprüngliche Code so wie er ist kompiliert. Gerade jetzt, Range::contains existiert als nächtliches Feature:

#![feature(range_contains)] 

fn main() { 
    let a = 3..5; 
    assert!(a.contains(4)); 
} 

Stabilisierung dieser Funktion wird verfolgt, in issue 32311.

Verwandte Themen