RustでProject Euler (4)

Iterator

Pythonならこのようなgeneratorを作りたいかもしれません。

def fibs():
    a, b = 0, 1
    while True:
        yield b
        a, b = b, a+b

Rustでは今のところこのような書き方はできないようです。
(Rustはバージョンでけっこう文法等が違うので、検索してもよくわからないことが多いです)
代わりにIteratorを作ることはできます。

use std::env;

struct Fibonacci {
    a: i64, b: i64
}

// 生成
impl Fibonacci {
    fn new() -> Fibonacci {
        Fibonacci { a: 0, b: 1 }
    }
}

// Iteratorの実装
impl Iterator for Fibonacci {
    type Item = i64;
    fn next(&mut self) -> Option<i64> {
        let x = self.a;
        self.a = self.b;
        self.b += x;
        Some(x)
    }
}

fn main() {
    let args: Vec<String> = env::args().collect();
    let n: i64 = args[1].parse().unwrap();
    let s: i64 = Fibonacci::new().filter(|&f| f%2 == 0).take_while(|&f| f <= n).sum();
    println!("{}", s);
}

Iteratorを継承したクラスを作るみたいな感じですね。面倒ですね。