#[derive(Debug, Clone, Copy)]
pub struct Tokens<'a, T> {
pub tokens: &'a [T],
}
#[derive(Debug, Clone)]
pub struct Token {
pub t: String,
}
fn workOnTokens<'a>(input: Tokens<'a, Token>) -> Tokens<'a, Token> {
let a = input.tokens.slice(0..2);
Tokens { tokens: a }
}
fn main() {
let t = vec![Token {t: String::from("sdasd"),}, Token {t: String::from("11"),},Token {t: String::from("22"),},Token {t: String::from("33"),},];
let to: Tokens<Token> = Tokens { tokens: &t };
let b = workOnTokens(to);
let c = workOnTokens(to); // <---- this would ends up with `use of moved value
}
while
#[derive(Debug, Clone, Copy)]
pub struct Tokens<'a> {
pub tokens: &'a [Token],
}
#[derive(Debug, Clone)]
pub struct Token {
pub t: String,
}
fn workOnTokens<'a>(input: Tokens<'a>) -> Tokens<'a> {
let a = input.tokens.slice(0..2);
Tokens { tokens: a }
}
fn main() {
let t = vec![Token {t: String::from("sdasd"),}, Token {t: String::from("11"),},Token {t: String::from("22"),},Token {t: String::from("33"),},];
let to = Tokens { tokens: &t };
let b = workOnTokens(to);
let c = workOnTokens(to);
}
The first one would got compile error like
error[E0382]: use of moved value: `to`
--> src/main.rs:47:26
|
43 | let to: Tokens<Token> = Tokens { tokens: &t };
| -- move occurs because `to` has type `Tokens<'_, Token>`, which does not implement the `Copy` trait
44 |
45 | let b = workOnTokens(to);
| -- value moved here
46 |
47 | let c = workOnTokens(to);
| ^^ value used here after move
The second works fine without use of moved value
. Why is that?