2015-02-01 12 views
5

Mi piacerebbe essere in grado di creare un Range e quindi verificare se una variabile è contenuta in tale intervallo. Qualcosa che assomiglia a questo:Come posso verificare se un valore si trova all'interno di un intervallo?

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

In questo momento, l'unica cosa ovvia che vedo è quello di utilizzare Iterator::any. Questo è brutto perché ci vorrebbe un O (1) il funzionamento e renderlo O (n):

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

Ho una cassa ('range_check') che fornisce i tratti' Contains' e 'Within' per questo. –

risposta

4

Non c'è niente sul Range stessa (attualmente, in ogni caso), ma non è difficile fare questo; dopo tutto, ci vuole solo un paio di confronti:

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

Credi che un PR per aggiungere questo (a tutte le strutture 'Range *') sia il benvenuto? – Shepmaster

+2

Non senza RFC. Francamente, l'espansione di feature non essenziali è improbabile prima di 1.0. Detto questo, una RFC è relativamente facile da scrivere. – bluss

+0

E i numeri negativi? – mkirk

0

In un paio di uscite, il codice originale verrà compilato così com'è. In questo momento, Range::contains esiste come una caratteristica notturno:

#![feature(range_contains)] 

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

stabilizzazione di questa funzione viene tracciato in issue 32311.

Problemi correlati