LoginSignup
51
43

More than 5 years have passed since last update.

イテレータを返す関数を書きたいんですけど? → やめとけ。 死ぬぞ。

Last updated at Posted at 2015-02-24

 

 Rust

Rust    Vec






Vec<i32>23
Rust 
fn the_function(v1: &Vec<i32>, v2: &Vec<i32>) -> Iterator<i32> {
    v1.iter().chain(v2.iter()).filter(|x| x % 3 == 0)
}

本当はこうなります。

fn the_function<'a>(v1: &'a Vec<i32>, v2: &'a Vec<i32>) -> std::iter::Filter<std::iter::Chain<std::slice::Iter<'a, i32>, std::slice::Iter<'a, i32>>, fn(&&i32) -> bool> {
    fn only_multiples_3(x: &&i32) -> bool { *x % 3 == 0 };
    v1.iter().chain(v2.iter()).filter(only_multiples_3)
}

1
  

 Iterator<i32> trait  Iterator<i32> impl 

Rustfilter(...)使 使使 IteratorIterator impl Vec<i32>2fn(&&i32) -> bool使 Rust

JavaIterator<E>  Java  Rust
使 
 () Rust使 trait  
fn print_iter<'a, I: Iterator<Item=&'a i32>>(iter: I) {  // ここでは引数の"型"は明示せず、traitだけでいい
    for v in iter {
        println!("The iterator's value is {}", v);
    }
}

fn main() {
    let v1 = vec![1, 3, 5];
    let v2 = vec![2, 4, 6];
    // ここではiterの型は勝手に推論される
    let iter = v1.iter().chain(v2.iter()).filter(|x: &&i32| *x % 3 == 0);
    print_iter(iter);
}

 'a&&Rust 

Java Box<T>T trait Box<Iterator<Item=T>>
IteratorVec<T> Vec<T>
Java

 1.0 ()

: RFC: Add unboxed, abstract return types #105
51
43
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

51
43