gpt4 book ai didi

reference - 在 rust 中保持干燥

转载 作者:行者123 更新时间:2023-11-29 08:19:34 26 4
gpt4 key购买 nike

有时我必须对以长序列表示的信息采取行动,例如:

f1(f2(f3).f4(x,f5(y,z))).f6().f7()

(不一定,只是您不想重复的任何长序列)。我可能需要多次引用它,中间还有其他代码。像这样:

fn myfunc(v: &T) -> X {
match v.func(func(v.func().func())).func() {
...
}
.. other stuff ..
match v.func(func(v.func().func())).func() {
...
}
}

该值是不可移动的,所以我不能将它分配给一个变量,然后像在其他语言中那样引用该变量两次,所以基本上我发现自己多次编写相同的函数调用序列。我试过这样的事情

let x = &( ... )

然后使用这个

*x

但这没有用。我想我可以使用一个宏,但每次都会重新计算它(......这还不错,因为大多数函数调用只是编译器和类型系统的糖),但这是我解决的最好的到目前为止。还有别的办法吗?

最佳答案

如果值不是 Copy ,那么您要么需要复制它,要么通过引用传递。例如。假设它正在计算 T 类型的值.我想你目前遇到的问题是

fn foo(x: T) { ... }
fn bar(x: T) { ... }


let your_thing = f1(f2(f3).f4(x,f5(y,z))).f6().f7();

foo(your_thing);
bar(your_thing); // error: use of moved value

正确的修复是改变 foo行到

fn foo(x: &T) { ... }

foo(&your_thing);

或者,foo调用 foo(your_thing.clone()) (如果 TClone )。您可以通过考虑哪种所有权来决定哪一个是合适的 foo T 的需求: 如果它需要完全所有权(例如将它传递给不同的任务),你应该按值取值 foo(x: T) ;另一方面,如果它只需要查看数据(即没有所有权),那么引用 foo(x: &T) .

另见 "Moves vs Copy in Rust"有关移动和复制的一些背景知识。它包括对为什么 &(...) 的解释。 + *x解决方案不起作用:不能从引用后面移出(尽管在这种情况下它永远不会起作用,因为移出两次无论如何都是非法的)。


同样的道理也适用于模式匹配:如果你只需要一个引用,你可以通过ref将引用取到感兴趣的值中。 .例如。假设你正在计算一个 Option<T> .

let x = v.func(func(v.func().func())).func()

match x {
Some(ref y) => { /* y is a &T */ ... }
None => { ... }
}

// the last `match` can move `x`
match x {
Some(y) => { /* y is a T */ ... }
None => { ... }
}

如果第一个匹配确实需要对 x 的某些部分的所有权, 你可以 clone x本身,或者仅匹配 ref 后需要的那些部分.

关于reference - 在 rust 中保持干燥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24518439/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com