Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Chapter5 構造体 #9

Open
euledge opened this issue Feb 21, 2019 · 1 comment
Open

Chapter5 構造体 #9

euledge opened this issue Feb 21, 2019 · 1 comment

Comments

@euledge
Copy link
Owner

euledge commented Feb 21, 2019

5.1 構造体の宣言

名と型を指定した複数の変数に名前を付けて複合型として宣言したもの

struct User {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool
}
@euledge
Copy link
Owner Author

euledge commented Feb 21, 2019

5.1.1 構造体のインスタンス化

    let user = User {
        email: String::from("someone@mail"),
        username: String::from("somebody_name"),
        active: false,
        sign_in_count: 0
    };

フィールドは key:value の形で指定するため、宣言の順序と異なる任意の順番でよい。
ただし定義したフィールドの数と同じ数でなければならない。

5.1.2 インスタンス化した構造体のアクセス

5.1.1でインスタンス化された構造体に対しては . によりフィールドにアクセスできる。

println!("username is : {}", user.username);

5.1.3 可変性

mutにより可変と宣言された構造体のフィールドは変更可能でsる
ただし、構造体インスタンス全体に対してmutableを指定でき、個々のフィールド別に immutable, mutableを指定することはできない。

    let mut user = User {
        email: String::from("someone@mail"),
        username: String::from("somebody_name"),
        active: false,
        sign_in_count: 0
    };
    user.email = String::from("other@mail");

5.1.4 フィールドと変数が同名の時にフィールド初期化省略記法を使う。

下記例ではフィールド名とその変数がともに同じ名称 (email) であるので
email: email という記述を省略して email と書くことができる。

    let email = String::from("someone@mail");
    let mut user = User {
        email
        username: String::from("somebody_name"),
        active: false,
        sign_in_count: 0
    };

5.1.5 構造体初期化記法を使う

フィールド名を省略するだけではなく、さらに構造体自体の初期化を別のインスタンスを用いて
簡易的に記述できる

        let user1 = User {
            email: String::from("someone@mail"),
            username: String::from("somebody_name"),
            active: false,
            sign_in_count: 0,
        };
        println!("user1 {}", user1.email);
        // user2 を user1 を使用してインスタンス化する。
        let user2 = User { ..user1 };

user1は user2の初期化を行ったときに所有権が移動する。

error[E0382]: borrow of moved value: `user1.email`
  --> src/main.rs:50:30
   |
48 |         let user2 = User { ..user1 };
   |                     ---------------- value moved here
49 |         println!("user2 {}", user2.email);
50 |         println!("user1 {}", user1.email);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant