Rustの書き方
よく使う文法・タグ・操作を、短い例で。42項目から探せます。
42 / 42項目
基本の形や関数内の抜粋を掲載しています。そのまま実行する例と準備方法は、各言語の「学ぶ」ページで確認できます。
変数と表示
letで値を覚え、println!で表示します。
let name = "海";
println!("{}", name);条件分岐
条件に応じて処理を変えます。
let age = 20;
if age >= 18 {
println!("成人");
} else {
println!("未成年");
}繰り返し
範囲の値を順に取り出します。
for number in 1..=3 {
println!("{}", number);
}関数
引数と結果の型を書きます。
fn add(a: i32, b: i32) -> i32 { a + b }ベクター
可変長の一覧を作ります。
let names = vec!["海", "空"];
println!("{}", names[0]);構造体
関連する値をまとめます。
struct User { name: String }
fn main() {
let user = User { name: String::from("海") };
println!("{}", user.name);
}借用
値を移さず、参照で読みます。
let name = String::from("海");
let borrowed = &name;
println!("{}", borrowed);
println!("{}", name);mut・const
変更できる値と定数。
let mut age = 20;
age += 1;
const LIMIT: i32 = 10;文字列
所有する文字列を作り、追加する。
let mut name = String::from("海");
name.push_str("さん");配列・タプル
固定長の一覧と値の組。
let nums = [1, 2, 3];
let user = ("海", 20);
let (name, age) = user;push・len
ベクターに追加し、長さを得る。
let mut nums = vec![1, 2];
nums.push(3);
println!("{}", nums.len());HashMap
キーと値を対応させる。
use std::collections::HashMap;
let mut ages = HashMap::new();
ages.insert("海", 20);while・loop
条件付き、または明示的な終了まで繰り返す。
let mut i = 0;
while i < 3 { i += 1; }
loop { break; }match
パターンに応じて処理を分ける。
let n = 1;
match n {
1 => println!("一"),
_ => println!("その他"),
}enum
候補を持つ型を作る。
enum Status { Draft, Published }
let status = Status::Draft;Option・if let
値があるかもしれない状態。
let name: Option<&str> = Some("海");
if let Some(value) = name { println!("{}", value); }Result
成功と失敗を分けて受け取る。
let result = "20".parse::<i32>();
match result {
Ok(age) => println!("{}", age),
Err(error) => println!("{}", error),
}所有権の移動
文字列の所有者を別の変数へ移す。
let name = String::from("海");
let next = name;
println!("{}", next);移動後のnameは使えません。
可変の借用
参照経由で値を変える。
let mut name = String::from("海");
let reference = &mut name;
reference.push_str("さん");impl
型にメソッドを付ける。
struct User { name: String }
impl User {
fn greet(&self) -> &str { &self.name }
}trait
型が提供する操作を定める。
trait Greeter {
fn greet(&self) -> String;
}イテレーター・map・collect
値を変えて一覧に集める。
let nums = vec![1, 2, 3];
let doubled: Vec<i32> = nums.iter().map(|n| n * 2).collect();文字を数値にする
parseは変換の成功か失敗をResultで返します。
let result = "12".parse::<i32>();
if let Ok(count) = result {
println!("{count}");
}文字列に値を埋め込む
format!で値を含むStringを作ります。
let age = 20;
let text = format!("年齢: {age}");区切って集める
splitで分けた文字列をVecに集めます。
let colors: Vec<&str> = "赤,青,白".split(',').collect();
println!("{}", colors[0]);空白除去と置き換え
trimで空白を除き、replaceで置き換えます。
let text = " hello ".trim();
let message = text.replace("hello", "こんにちは");文字ごとに読む
charsで文字列を1文字ずつ取り出します。
for letter in "こんにちは".chars() {
println!("{letter}");
}charはUnicodeのコードポイントです。
文字が含まれるか確認
containsやends_withで文字列を調べます。
let file = "memo.txt";
let is_text = file.ends_with(".txt");
let has_memo = file.contains("memo");ifの結果を値にする
ifのそれぞれの枝から同じ型の値を返します。
let age = 20;
let label = if age >= 18 { "成人" } else { "未成年" };値がないときの初期値
unwrap_orでNoneのときの値を決めます。
let score: Option<i32> = None;
let value = score.unwrap_or(0);失敗を呼び出し元に返す
?は失敗時にそのエラーを返して関数を終えます。
fn read() -> Result<String, std::io::Error> {
let text = std::fs::read_to_string("memo.txt")?;
Ok(text)
}範囲を確認して取得
getは要素がないとNoneを返します。
let scores = vec![80, 90];
if let Some(score) = scores.get(0) {
println!("{score}");
}配列の変更・削除
mutで変更可能にして要素を操作します。
let mut scores = vec![80, 90];
scores[0] = 85;
scores.remove(1);
let last = scores.pop();並べ替えと重複除去
sortの後にdedupすると重複をまとめられます。
let mut values = vec![3, 1, 1, 2];
values.sort();
values.dedup();配列の一部を借りる
範囲を指定して要素の一部を参照します。
let values = [10, 20, 30, 40];
let part = &values[1..3];開始位置は含み、終了位置は含みません。
辞書の初期値を入れる
entryでキーがないときだけ初期値を登録します。
use std::collections::HashMap;
let mut counts = HashMap::new();
*counts.entry("りんご").or_insert(0) += 1;重複しない集合
HashSetには同じ値が1回だけ入ります。
use std::collections::HashSet;
let values: HashSet<i32> = [1, 1, 2].into_iter().collect();Rust 2021以降の例です。
値を分けて受け取る
タプルの中身を別々の変数に入れます。
let point = (10, 20);
let (x, y) = point;短い関数を値にする
縦線の中に引数を書くとクロージャになります。
let twice = |value: i32| value * 2;
let result = twice(3);比較や表示を自動で用意
deriveでDebugやPartialEqの実装を作れます。
#[derive(Debug, PartialEq)]
struct Point { x: i32, y: i32 }
// println!("{:?}", Point { x: 1, y: 2 });1行を入力する
read_lineで入力をStringに追加します。
let mut text = String::new();
match std::io::stdin().read_line(&mut text) {
Ok(_) => println!("{}", text.trim()),
Err(error) => eprintln!("{error}"),
}ファイルに書く
writeの戻り値で書き込みの成功を確認します。
if let Err(error) = std::fs::write("memo.txt", "こんにちは") {
eprintln!("{error}");
}既存の内容を上書きします。