RustでTupleの要素の書き換えと取り出し

フィールド名で扱う

let mut tuple = (1, 2);

assert_eq!(tuple.0, 1);
assert_eq!(tuple.1, 2);

tuple.0 += 1;
tuple.1 += 2;

assert_eq!(tuple.0, 2);
assert_eq!(tuple.1, 4);

パターンマッチで扱う

let tuple = (1, 2);

let (mut a, mut b) = tuple;

assert_eq!(a, 1);
assert_eq!(b, 2);

a += 1;
b += 2;

assert_eq!(a, 2);
assert_eq!(b, 4);

なんとなくはめていたつもりだったが、これをパターンマッチと呼ぶのかと関心した。

Rustでオーバーフローを検査しながら演算する

桁溢れになることが想定されている場合は、checked_系の関数を使って演算すると結果をOptionで得られるらしいです。

fn main() {
    let a = std::i8::MAX;
    let b = 1i8;

    assert_eq!(a.checked_add(b), None);
    assert_eq!(a.checked_sub(b), Some(126i8));
}

これを使っておかないと桁溢れが起きた時にpanic!になるし、リリースモードでは誤った結果が得られるらしい。怖いンゴ。他にも最大値を超える数値になる場合は最大値で固定したりする関数もあって、うまく使えば面倒な判定が不要になるので使う場面は多そうだ。

https://doc.rust-lang.org/std/primitive.i8.html

Rustの整数リテラルで数値をアンダースコアで見やすくする

数値の中でアンダースコアが使えるので、定数を定義するような時とかに使って見やすくできる。巨大な値とかだと0の数わかんなくなりそうになったりするので嬉しい。

fn main() {
    let a = 100_000_000;
    let b = 100000000;

    assert_eq!(a, b);
}

https://doc.rust-jp.rs/book/second-edition/ch03-02-data-types.html#a%E6%95%B4%E6%95%B0%E5%9E%8B

Rustの()はユニット型

特に気にせず書いていたが、どうやらユニット型というらしい。

1つだけ値を持っていて、空のタプルだとか。関数で戻り値を指定しない場合に戻る値がこれにあたり、省略することができます。サイズが0バイトらしいので、一時的に何かダミーを突っ込む時に使ってもいいかもしれないらしい。

https://doc.rust-lang.org/std/primitive.unit.html

耳まで焼けるホットサンドメーカーでパン焼く

あつほかダイニングというホットサンドメーカーにはまってます。

パンの間に余った具材などを挟んで、パンでサンドして焼けるやつです。パンなんて焼いてあとからサンドすればいいだろと思っていたんですけど、やっぱり潰すので食べやすいサイズに圧縮されるんですな。

このホットサンドメーカーは耳まで焼いてくれるので、パンを余すことなく焼くことができて重宝しておりますが、シチューのようなものを挟んで焼くと、耳のところ潰すタイプではないのが裏目にでて、全部飛び出てしまいます。流動的な具材を挟む場合はもっと別のタイプのやつがいいですな。

あとはトースターとかなくても焼けるので、これまた災害時とかにも使えるという。。防災に最近はまっております。