当在一个 struct 切片上循环时,我得到的值是一个引用(这很好),但是在某些情况下,在许多地方必须将var写为(*var)是很烦人的.

有没有更好的方法避免重新声明变量?

fn my_fn(slice: &[MyStruct]) {
    for var in slice {
        let var = *var;  // <-- how to avoid this?

        // Without the line above, errors in comments occur:

        other_fn(var);  // <-- expected struct `MyStruct`, found reference

        if var != var.other {
            // ^^ trait `&MyStruct: std::cmp::PartialEq<MyStruct>>` not satisfied
            foo();
        }
    }
}

见:actual error output(更神秘).

推荐答案

您可以通过在the pattern中分解 struct 来删除引用:

//  |
//  v
for &var in slice {
    other_fn(var);
}

However,这只管用for 101-types!如果您有一个不实现Copy但实现Clone的类型,那么可以使用cloned()迭代器适配器;更多信息请参见Chris Emerson's answer.

Rust相关问答推荐

交叉术语未正确清除屏幕

如何将`Join_all``Vec<;Result<;Vec<;Foo&>;,Anywhere::Error&>;`合并到`Result<;Vec<;Foo&>;,Anywhere::Error&>;`

带扫描的铁 rust 使用滤镜

"value is never read警告似乎不正确.我应该忽略它吗?

有没有办法避免在While循环中多次borrow `*分支`

在Rust中声明和定义一个 struct 体有什么区别

你能在Rust中弃用一个属性吗?

链表堆栈溢出

由于生存期原因,返回引用的闭包未编译

是否可以使用Serde/Rust全局处理无效的JSON值?

Rust proc_macro 和 syn:解析空格

在使用粗粒度锁访问的数据 struct 中使用 RefCell 是否安全?

使用在功能标志后面导入的类型,即使未启用功能标志

如何将这些测试放在一个单独的文件中?

如何获取函数中borrow 的切片的第一部分?

在 Rust 中,将可变引用传递给函数的机制是什么?

使用方法、关联函数和自由函数在 Rust 中初始化函数指针之间的区别

在空表达式语句中移动的值

编写 TOML 文件以反序列化为 struct 中的枚举

为什么 Bevy 的 Trait 边界不满足 Rapier 物理插件?