たなしょのメモ

日々勉強していることをつらつらと

Rust勉強してみた 2日目

所有権

Rustを学んでるときにかなり難しかった。

let s1 = String::from("hello");
let s2 = s1;

この文法でもエラーは起きなかった。

だがこの文法にしても正常に実行できる。

let s1 = String::from("hello");
let s2 = s1.clone();

これはclone関数を呼び出すことで文字列をコピーしている。

Rustのバージョンが上がったことで教材の違う点がいくつかあるのかもしれない。 エラーになる文法をいくつか入力しても特に問題なく実行できしまう。

また所有権にはライフタイムが存在して各関数ごとに変数を消去しているしているため関数を作る際は気を付けて作成しなければならないだろう。

ちょっとだけ学べたこと

引数を二つ戻り値を二つ以上記載する場合は()をつけて表すことができるらしい。

fn smp_main3() {
    let s1 = String::from("hello");

    let (s2, len) = calculate_length(s1);

    println!("The length of '{}' is {}.", s2, len);
}

fn calculate_length(s: String) -> (String, usize) {
    let length = s.len();

    (s, length)
}

参照型

参照型も少し学べた。 mutをつけることで可変長にでき、文字列を追加できるらしい。

fn smp_main5() {
    let mut s = String::from("hello");

    change(&mut s);

    println!("{}", s)
}

fn change(some_string: &mut String) {
    some_string.push_str(", world");
}

構造体

CとGoと割と形は似てるかなと思った。

fn main() {
    struct User {
        username: String,
        email: String,
        sign_in_count: u64,
        active: bool,
    }

    let user1 = User {
        email: String::from("someone@example.com"),
        username: String::from("someusername123"),
        active: true,
        sign_in_count: 1,
    };

    let user2 = User {
        email: String::from("another@example.com"),
        username: String::from("anorherusername567"),
        ..user1
    };
}

ただ以降のデータを以前の構造体と同じにしたい場合、

..user1

上記のような記載の仕方で省略できるのはありがたいと思った。 今度何かを作る際は積極的に使っていきたい。