2017-08-30 16 views
6

Mam wektor Option s i chcę filtrować tylko Some s. Używam filter_map z tożsamością:Czy w Rust istnieje wbudowana funkcja identyfikacji?

let v = vec![Some(1), None, Some(2)]; 
for i in v.into_iter().filter_map(|o| o) { 
    println!("{}", i); 
} 

Czy istnieje funkcja wbudowana pozwalając, aby napisać coś podobnego filter_map(identity)?

+2

Należy zauważyć, że "tożsamość" to 4 znaki więcej niż w oryginalnym przykładzie; Spodziewałbym się, że ludzie będą zbyt leniwi, żeby to napisać^_ ^. – Shepmaster

+4

@Shepmaster Kiedyś ekspresja jest lepsza niż zwięzłość: p – Boiethios

+0

@Shepmaster: Podobnie jak w przypadku odpowiedzi, F # nazywa ją 'id', więc istnieje przynajmniej precedens dla tego w stdlib. – ildjarn

Odpowiedz

6

Nie, nie ma takiej funkcji. Możesz utworzyć własną:

fn id<T>(v: T) -> T { v } 

Chociaż większość ludzi po prostu wstawia kod, tak jak Ty.

+0

Zrobiłem kolejny, gdy element nie został przeniesiony: 'fn id_deref (v: & Opcja ) -> Opcja <&T> {v.as_ref()}' – Boiethios

+2

@Booiios Byłbym bardzo niezdecydowany, aby nazwać to coś jak "tożsamość "biorąc pod uwagę, że zmienia wartość. Nie nazwałbym tego również "deref", ponieważ oznacza to coś w Rustie, co nie jest funkcją tej funkcji. Ponadto ta funkcja jest zbędna; możesz po prostu powiedzieć 'Option :: as_ref' zamiast tego. – Shepmaster

+0

Dzięki za ostatni punkt, nauczysz mnie czegoś. – Boiethios

Powiązane problemy