RustでProject Euler (1)

いま流行りのRustの勉強のために、RustでProject Eulerを解いていきます。Rustはそんなに簡単ではないです。

install

Windows 10のUbuntuに入れます。
ここを参考にしました。
https://doc.rust-jp.rs/book/second-edition/ch01-01-installation.html

$  rustc -V
rustc 1.40.0 (73528e339 2019-12-16)

Problem 1

https://projecteuler.net/problem=1

fn main() {
    let n: i64 = 1000;
    let mut s = 0;
    for i in 1..n {
        if i % 3 == 0 || i % 5 == 0 {
            s += i;
        }
    }
    println!("{}", s);
}

頭から説明していきます。

関数

fn main() {

関数はfnをつけて定義します。

変数

    let n: i64 = 1000;

変数の宣言はletで行います。letのあと、変数、型と書きます。整数は、i64とかi32とかビット数で型名を決めています。i16とかi8とかi128もあるようです。
ここでnをNとして、

    let N: i64 = 1000;

コンパイルすると、怒られてしまいました。

$ rustc e001.rs
warning: variable `N` should have a snake case name
 --> e001.rs:2:6
  |
2 |     let N: i64 = 1000;
  |         ^ help: convert the identifier to snake case: `n`
  |
  = note: `#[warn(non_snake_case)]` on by default

変数は基本、snake caseのようです。

    let mut s = 0;

これが和のための変数です。型は、0で初期化されているのでi64のようです。
letのあとにmutがついているのは、この変数がmutableという意味です。すなわち、変数はデフォルトではimmutableです。C++と違って、何でもかんでもconstをつけなくてもいいわけです。

ループ

    for i in 1..n {
        ...
    }

これで、iは1からn-1を取ります。パレーンを使わないのは最近の言語と流行りっぽいですね。

if

    if i % 3 == 0 || i % 5 == 0 {
        s += i;
    }

ifもパレーンを使わないんですね。でも、orは||。ここをorとすると、

    if i % 3 == 0 or i % 5 == 0 {
$ rustc e001.rs
error: expected `{`, found `or`
 --> e001.rs:5:17
  |
5 |         if i % 3 == 0 or i % 5 == 0 {
  |         --            ^^ expected `{`
  |         |
  |         this `if` statement has a condition, but no block
  |
help: use `||` instead of `or` for the boolean operator
  |
5 |         if i % 3 == 0 || i % 5 == 0 {
  |                       ^^
help: try placing this code inside a block
  |
5 |         if i % 3 == 0 { or } i % 5 == 0 {
  |                       ^^^^^^

error: aborting due to previous error

Rustでは、このようにわかりやすいエラーメッセージが出ます。