いま流行りの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では、このようにわかりやすいエラーメッセージが出ます。