相关疑难解决方法(0)

如何强制移动实现复制特征的类型?

默认情况下,自定义类型通过默认分配移动.通过实现Copy特性,我通过默认赋值获得"浅拷贝语义".我也可以通过实现Clone特征来获得"深度复制语义" .

有没有办法强制搬迁Copy类型?

我尝试使用move关键字和一个closure(let new_id = move || id;),但我收到一条错误消息.我还没有关闭,但是,从这里和那里看到它们,我认为那会有效.

rust

8
推荐指数
4
解决办法
3689
查看次数

如何在 Rust 中复制而不是借用 i64 到闭包中?

我的代码有以下最小示例:

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)

copy rust borrowing

5
推荐指数
1
解决办法
6165
查看次数

为什么我仍然可以使用`move`闭包捕获的变量?

我写了一个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真正在这里做?

rust

3
推荐指数
1
解决办法
51
查看次数

标签 统计

rust ×3

borrowing ×1

copy ×1