|
ToDo:
|
brew install rust
で使っておりましたがrustupがなかったので
brew uninstall rust
して
curl https://sh.rustup.rs -sSf | sh
してinstallしなおしました。
なおuninstallは
rustup self uninstall
らしいvia Installation - The Rust Programming Language*1
*1 まだやっていませんがオフィシャルなサイトにありました。
悪いまま戻らず。明日も休みにせざるを得ないなぁ。誰だヲレに盛ったのはー
ようやく復活したかな。昼Beer呑んでちょっといい気分
久しぶりの会社。往路だけでヘロヘロでした。
これがコンパイルエラーになってくれるんですよ。
fn main() {
let v = vec![1,2,3];
let v2 = v;
println!("{}",v[0]);
}
error[E0382]: use of moved value: `v`
--> src/main.rs:4:19
|
3 | let v2 = v;
| -- value moved here
4 | println!("{}",v[0]);
| ^ value used here after move
|
= note: move occurs because `v` has type `std::vec::Vec<i32>`, which does not implement the `Copy` trait
これコンパイルエラーです。
fn main() {
let mut x = 5;
let y = &mut x;
*y = 1;
println!("{}",y);
println!("{}",x);
}
yがxを借用しているのだがそのyの生存期間がxより早く終わらない
error[E0502]: cannot borrow `x` as immutable because it is also borrowed as mutable
--> src/main.rs:8:19
|
4 | let y = &mut x;
| - mutable borrow occurs here
...
8 | println!("{}",x);
| ^ immutable borrow occurs here
9 | }
| - mutable borrow ends here
error: aborting due to previous error
だから{}でyの生存期間を短くしてやると通る
fn main() {
let mut x = 5;
{
let y = &mut x;
*y = 1;
println!("{}",y);
}
println!("{}",x);
}
あと*yで参照の実体*1を変更しているので出力は
1
1
です。
*1 表現あってる?
これは通る
fn main() {
let spaces = " ";
let spaces = spaces.len();
println!("{}",spaces);
}
がこれは警告で通る
fn main() {
let mut spaces = " ";
let spaces = spaces.len();
println!("{}",spaces);
}
Compileメッセージ
warning: variable does not need to be mutable
--> src/main.rs:2:9
|
2 | let mut spaces = " ";
| ^^^^^^^^^^
|
= note: #[warn(unused_mut)] on by default
Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs
Running `target/debug/study`
1
これも理解しておくのです。
構造体にトレイト*1を追加してあげないとコンパイルエラーになっちゃう。
struct Color{
r: u32,
g: u32,
b: u32,
}
fn main() {
let x = Color{r :255, g: 255, b: 255};
let y = x;
println!("{:?}",y);
}
これだと
error[E0277]: the trait bound `Color: std::fmt::Debug` is not satisfied
--> src/main.rs:11:21
|
11 | println!("{:?}",y);
| ^ the trait `std::fmt::Debug` is not implemented for `Color`
|
= note: `Color` cannot be formatted using `:?`; if it is defined in your crate, add `#[derive(Debug)]` or manually implement it
= note: required by `std::fmt::Debug::fmt`
error: aborting due to previous error
だそうなのでdebug traitを追加
#[derive(Debug)]
struct Color{
r: u32,
g: u32,
b: u32,
}
fn main() {
let x = Color{r :255, g: 255, b: 255};
let y = x;
println!("{:?}",y);
}
この時点ではCopy Traitを追加してないので
#[derive(Debug)]
struct Color{
r: u32,
g: u32,
b: u32,
}
fn main() {
let x = Color{r :255, g: 255, b: 255};
let y = x;
println!("{:?}",y);
println!("{:?}",x);
}
だとコンパイルエラーです
error[E0382]: use of moved value: `x`
--> src/main.rs:12:21
|
10 | let y = x;
| - value moved here
11 | println!("{:?}",y);
12 | println!("{:?}",x);
| ^ value used here after move
|
= note: move occurs because `x` has type `Color`, which does not implement the `Copy` trait
error: aborting due to previous error
そこでCopyとClone Traitを追加してあげると通ります
#[derive(Debug,Copy,Clone)]
struct Color{
r: u32,
g: u32,
b: u32,
}
fn main() {
let x = Color{r :255, g: 255, b: 255};
let y = x;
println!("{:?}",y);
println!("{:?}",x);
}
それかyのscopeを狭めて借用を使うんですかね。
#[derive(Debug)]
struct Color{
r: u32,
g: u32,
b: u32,
}
fn main() {
let x = Color{r :255, g: 255, b: 255};
{
let y = &x;
println!("{:?}",y);
}
println!("{:?}",x);
}
*1 特性
本当はgenericsにしたかったのだがcompile error が取れない。
#[derive(Debug)]
struct LinkedList {
val: &'static str,
next: Option
}
pub fn chain(){
let mut root = LinkedList{val: "Taro", next: None};
root.next = Some(Box::new(LinkedList{val: "Jiro", next: None}));
println!("{:?}",root);
}
BoxにしないとLinkedListをメンバーにもたせると
--> src/linkedlist.rs:3:5
|
3 | struct LinkedList {
| ^^^^^^^^^^^^^^^^^ recursive type has infinite size
|
= help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `linkedlist::foo::LinkedList` representable
てな感じで無限ループでsizeが取れないのでcompile error になるそうです。