默认情况下,自定义类型将通过默认分配移动.通过实现Copy特性,我通过默认赋值获得"浅拷贝语义".我也可以通过实现Clone特征来获得"深度复制语义" .
有没有办法强制搬迁在Copy类型?
我尝试使用move关键字和一个closure(let new_id = move || id;),但我收到一条错误消息.我还没有关闭,但是,从这里和那里看到它们,我认为那会有效.
我的代码有以下最小示例:
fn main()
{
let names : Vec<Vec<String>> = vec![
vec!["Foo1".to_string(), "Foo2".to_string()],
vec!["Bar1".to_string(), "Bar2".to_string()]
];
let ids : Vec<i64> = vec![10, 20];
names.iter().enumerate().flat_map(|(i,v)| {
let id : i64 = ids[i];
v.iter().map(|n|
(n.clone(), id)
)
});
}
Run Code Online (Sandbox Code Playgroud)
现在,当我编译它时,rustc我收到以下错误消息:
error[E0597]: `id` does not live long enough
--> main.rs:12:16
|
11 | v.iter().map(|n|
| --- capture occurs here
12 | (n.clone(), id)
| ^^ borrowed value does not live long enough
13 | )
14 | });
| -- borrowed value …Run Code Online (Sandbox Code Playgroud) 我写了一个Rust程序,它生成小写英文字母的所有两个字母的排列("aa","ab",...,"zy","zz"):
fn main() {
static ASCII_LOWER: [char; 26] = [
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
];
let x: Vec<_> = ASCII_LOWER.iter().flat_map(|a| {
let result = ASCII_LOWER.iter().map(move |b| {
format!("{}{}", a, b)
});
dbg!(a); // <--- How can `a` still be used?
result
}).collect();
dbg!(x);
}
Run Code Online (Sandbox Code Playgroud)
我需要将内部封闭标记为move,因为否则所捕获的借用a不够长.但是,move在这种情况下,我不明白这实际上是做什么的.a关闭后我仍然可以使用.什么是move真正在这里做?