20 文法の基本
Chapter 1
fn main() {
let name = inquire::Text::new("あなたのお名前は?").prompt().unwrap();
let user = User::new(name);
let stocks = Item::default_stocks();
println!("{}", user);
let _cart = inquire::MultiSelect::new("買いたい商品を選んでください", stocks).prompt();
println!("{}", user);
}
main関数
Slide 21
Slide 21 text
21 文法の基本
Chapter 1
let name = inquire::Text::new("あなたのお名前は?").prompt().unwrap();
let user = User::new(name);
let stocks = Item::default_stocks();
letによる変数の定義と代入
「::」はモジュールや構造体などへのアクセス
「.」はメソッドへのアクセス
(詳しくは後で説明)
39 所有権と借用
Chapter 2
fn buy(_user: User, _cart: Vec, _stocks: Vec) {
…
}
…
let user = User::new(name);
let stocks = Item::default_stocks();
let cart = inquire::MultiSelect::new("買いたい商品を選んでください ",
stocks.clone())
.prompt()
.unwrap();
buy(user, cart, stocks);
どうやる?
Slide 40
Slide 40 text
40 所有権と借用
Chapter 2
$ cargo check
どうやる?
Slide 41
Slide 41 text
41 所有権と借用
Chapter 2
error[E0382]: borrow of moved value: `user`
--> src/chapter_2.rs:108:20
|
99 | let user = User::new(name);
| ---- move occurs because `user` has type `User`, which does not implement the `Copy` trait
...
106 | buy(user, cart, stocks);
| ---- value moved here
107 |
108 | println!("{}", user);
| ^^^^ value borrowed here after move
47 所有権と借用
Chapter 2
error[E0382]: borrow of moved value: `user`
--> src/chapter_2.rs:108:20
|
99 | let user = User::new(name);
| ---- move occurs because `user` has type `User`, which does not implement the `Copy` trait
...
106 | buy(user, cart, stocks);
| ---- value moved here
107 |
108 | println!("{}", user);
| ^^^^ value borrowed here after move
52 所有権と借用
Chapter 2
fn buy(_user: &User, _cart: Vec, _stocks: &Vec) {
…
}
…
let user = User::new(name);
let stocks = Item::default_stocks();
// コマンドラインにメッセージを出すためにライブラリが借用ではなく実体を要求するため
clone()
let cart = inquire::MultiSelect::new("買いたい商品を選んでください
", stocks.clone())
.prompt()
.unwrap();
buy(&user, cart, &stocks); // user, stocksは後でも表示などに用いたいので借用
Slide 53
Slide 53 text
53 所有権と借用
Chapter 2
$ cargo check
Slide 54
Slide 54 text
54 所有権と借用
Chapter 2
error[E0594]: cannot assign to `user.wallet`, which is behind a `&` reference
--> src/chapter_2.rs:105:5
|
95 | fn buy(user: &User, cart: Vec, stocks: &Vec) -> Result<(), Error> {
| ----- help: consider changing this to be a mutable reference: `&mut User`
...
105 | user.wallet -= total_price;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ `user` is a `&` reference, so the data it refers to cannot be written