14言語・590の書き方
CODE ATLAS / 文法辞典

Rustの書き方

よく使う文法・タグ・操作を、短い例で。42項目から探せます。

42 / 42項目

基本の形や関数内の抜粋を掲載しています。そのまま実行する例と準備方法は、各言語の「学ぶ」ページで確認できます。

変数と表示

letで値を覚え、println!で表示します。

main.rs
let name = "海";
println!("{}", name);
説明と練習この項目

条件分岐

条件に応じて処理を変えます。

main.rs
let age = 20;
if age >= 18 {
    println!("成人");
} else {
    println!("未成年");
}
説明と練習この項目

繰り返し

範囲の値を順に取り出します。

main.rs
for number in 1..=3 {
    println!("{}", number);
}
説明と練習この項目

関数

引数と結果の型を書きます。

main.rs
fn add(a: i32, b: i32) -> i32 { a + b }
説明と練習この項目

ベクター

可変長の一覧を作ります。

main.rs
let names = vec!["海", "空"];
println!("{}", names[0]);
説明と練習この項目

構造体

関連する値をまとめます。

main.rs
struct User { name: String }

fn main() {
    let user = User { name: String::from("海") };
    println!("{}", user.name);
}
説明と練習この項目

借用

値を移さず、参照で読みます。

main.rs
let name = String::from("海");
let borrowed = &name;
println!("{}", borrowed);
println!("{}", name);
説明と練習この項目

mut・const

変更できる値と定数。

main.rs
let mut age = 20;
age += 1;
const LIMIT: i32 = 10;
この項目

文字列

所有する文字列を作り、追加する。

main.rs
let mut name = String::from("海");
name.push_str("さん");
この項目

配列・タプル

固定長の一覧と値の組。

main.rs
let nums = [1, 2, 3];
let user = ("海", 20);
let (name, age) = user;
この項目

push・len

ベクターに追加し、長さを得る。

main.rs
let mut nums = vec![1, 2];
nums.push(3);
println!("{}", nums.len());
この項目

HashMap

キーと値を対応させる。

main.rs
use std::collections::HashMap;
let mut ages = HashMap::new();
ages.insert("海", 20);
この項目

while・loop

条件付き、または明示的な終了まで繰り返す。

main.rs
let mut i = 0;
while i < 3 { i += 1; }
loop { break; }
この項目

match

パターンに応じて処理を分ける。

main.rs
let n = 1;
match n {
  1 => println!("一"),
  _ => println!("その他"),
}
この項目

enum

候補を持つ型を作る。

main.rs
enum Status { Draft, Published }
let status = Status::Draft;
この項目

Option・if let

値があるかもしれない状態。

main.rs
let name: Option<&str> = Some("海");
if let Some(value) = name { println!("{}", value); }
この項目

Result

成功と失敗を分けて受け取る。

main.rs
let result = "20".parse::<i32>();
match result {
  Ok(age) => println!("{}", age),
  Err(error) => println!("{}", error),
}
この項目

所有権の移動

文字列の所有者を別の変数へ移す。

main.rs
let name = String::from("海");
let next = name;
println!("{}", next);

移動後のnameは使えません。

この項目

可変の借用

参照経由で値を変える。

main.rs
let mut name = String::from("海");
let reference = &mut name;
reference.push_str("さん");
この項目

impl

型にメソッドを付ける。

main.rs
struct User { name: String }
impl User {
  fn greet(&self) -> &str { &self.name }
}
この項目

trait

型が提供する操作を定める。

main.rs
trait Greeter {
  fn greet(&self) -> String;
}
この項目

イテレーター・map・collect

値を変えて一覧に集める。

main.rs
let nums = vec![1, 2, 3];
let doubled: Vec<i32> = nums.iter().map(|n| n * 2).collect();
この項目

文字を数値にする

parseは変換の成功か失敗をResultで返します。

main.rs
let result = "12".parse::<i32>();
if let Ok(count) = result {
    println!("{count}");
}
この項目

文字列に値を埋め込む

format!で値を含むStringを作ります。

main.rs
let age = 20;
let text = format!("年齢: {age}");
この項目

区切って集める

splitで分けた文字列をVecに集めます。

main.rs
let colors: Vec<&str> = "赤,青,白".split(',').collect();
println!("{}", colors[0]);
この項目

空白除去と置き換え

trimで空白を除き、replaceで置き換えます。

main.rs
let text = " hello ".trim();
let message = text.replace("hello", "こんにちは");
この項目

文字ごとに読む

charsで文字列を1文字ずつ取り出します。

main.rs
for letter in "こんにちは".chars() {
    println!("{letter}");
}

charはUnicodeのコードポイントです。

この項目

文字が含まれるか確認

containsやends_withで文字列を調べます。

main.rs
let file = "memo.txt";
let is_text = file.ends_with(".txt");
let has_memo = file.contains("memo");
この項目

ifの結果を値にする

ifのそれぞれの枝から同じ型の値を返します。

main.rs
let age = 20;
let label = if age >= 18 { "成人" } else { "未成年" };
この項目

値がないときの初期値

unwrap_orでNoneのときの値を決めます。

main.rs
let score: Option<i32> = None;
let value = score.unwrap_or(0);
この項目

失敗を呼び出し元に返す

?は失敗時にそのエラーを返して関数を終えます。

main.rs
fn read() -> Result<String, std::io::Error> {
    let text = std::fs::read_to_string("memo.txt")?;
    Ok(text)
}
この項目

範囲を確認して取得

getは要素がないとNoneを返します。

main.rs
let scores = vec![80, 90];
if let Some(score) = scores.get(0) {
    println!("{score}");
}
この項目

配列の変更・削除

mutで変更可能にして要素を操作します。

main.rs
let mut scores = vec![80, 90];
scores[0] = 85;
scores.remove(1);
let last = scores.pop();
この項目

並べ替えと重複除去

sortの後にdedupすると重複をまとめられます。

main.rs
let mut values = vec![3, 1, 1, 2];
values.sort();
values.dedup();
この項目

配列の一部を借りる

範囲を指定して要素の一部を参照します。

main.rs
let values = [10, 20, 30, 40];
let part = &values[1..3];

開始位置は含み、終了位置は含みません。

この項目

辞書の初期値を入れる

entryでキーがないときだけ初期値を登録します。

main.rs
use std::collections::HashMap;
let mut counts = HashMap::new();
*counts.entry("りんご").or_insert(0) += 1;
この項目

重複しない集合

HashSetには同じ値が1回だけ入ります。

main.rs
use std::collections::HashSet;
let values: HashSet<i32> = [1, 1, 2].into_iter().collect();

Rust 2021以降の例です。

この項目

値を分けて受け取る

タプルの中身を別々の変数に入れます。

main.rs
let point = (10, 20);
let (x, y) = point;
この項目

短い関数を値にする

縦線の中に引数を書くとクロージャになります。

main.rs
let twice = |value: i32| value * 2;
let result = twice(3);
この項目

比較や表示を自動で用意

deriveでDebugやPartialEqの実装を作れます。

main.rs
#[derive(Debug, PartialEq)]
struct Point { x: i32, y: i32 }
// println!("{:?}", Point { x: 1, y: 2 });
この項目

1行を入力する

read_lineで入力をStringに追加します。

main.rs
let mut text = String::new();
match std::io::stdin().read_line(&mut text) {
    Ok(_) => println!("{}", text.trim()),
    Err(error) => eprintln!("{error}"),
}
この項目

ファイルに書く

writeの戻り値で書き込みの成功を確認します。

main.rs
if let Err(error) = std::fs::write("memo.txt", "こんにちは") {
    eprintln!("{error}");
}

既存の内容を上書きします。

この項目