gpt4 book ai didi

rust - 在Rust中的元组中传递多个引用

转载 作者:行者123 更新时间:2023-12-03 11:43:57 25 4
gpt4 key购买 nike

我有一个具有某些关联类型的特征,并且其某些功能将该类型的引用作为输入:

trait Trait {
type Value;

fn do_something(&self, value: &Self::Value);
}
在实现此特征的一种结构中, Value是一个元组,因为我需要将多个值传递给 do_something:
struct Struct {}

impl Trait for Struct {
type Value = (i64, String);

fn do_something(&self, (a, b): &(i64, String)) {
println!("{} {}", a, b);
}
}
但是,当我随后在实践中使用 Struct时,我遇到了麻烦。我要么这样做:
fn main() {
let a = 10;
let b = "foo".to_owned();
let s = Struct {};

s.do_something(&(a, b)); // This works...
println!("{}", b); // ...but the borrow checker complains here
}
但是随后我失去了元组中任何非 Copy类型的所有权。或者,我可以这样做:
fn main() {
let a = 10;
let b = "foo".to_owned();
let s = Struct {};

let t = (a, b);
s.do_something(&t);
let (a, b) = t;
println!("{}", b);
}
可以,但是语法非常繁琐。
有人对我如何以更简洁的方式完成我想要的事情有想法吗?我试图让 Struct::Value的类型为 (&i64, &String),但是借阅检查器提示这些引用需要生存期,如果可能的话,我希望避免这种情况。
我尝试的另一种选择是使用类型参数(即 Trait<Value>)而不是关联的类型。在那种情况下,我可以让 Struct实现 Trait<(&i64, &String)>,而不会遇到关联类型的生命周期问题。它可以工作,但是在我的项目中,对于 Struct来说,不只拥有 Trait的一个以上实现是没有意义的,因此我更喜欢使用关联的类型。
谢谢你的时间 :-)

最佳答案

I tried to have Struct::Value be of type (&i64, &String), but then the borrow checker complains about needing a lifetime for those references, which I'd like to avoid if possible.


避免生命周期是不可能的。所有引用都有生命周期,编译器可以为您推断生命周期,而您必须显式注释生命周期。注意:编译器并不总是正确的,因此有时尽管编译器进行了推断,您仍然必须显式地注释生命周期。

In that case, I can have Struct implement Trait<(&i64, &String)> without the lifetime issue I had with an associated type.


是的,因为编译器推断出这些引用的生命周期确实起作用,但是您不应该害怕在需要时自己对它们进行明显注释。

It works, but in my project it never makes sense for Struct to have more than one implementation of Trait, so I'd much prefer to use an associated type.


好吧,让我们使用一个关联的类型。这是带有所有必需的生命周期批注的代码:
trait Trait<'a> {
type Value;

fn do_something(&self, value: Self::Value);
}

struct Struct {}

impl<'a> Trait<'a> for Struct {
type Value = (&'a i64, &'a String);

fn do_something(&self, (a, b): Self::Value) {
println!("{} {}", a, b);
}
}

fn main() {
let a = 10;
let b = "foo".to_owned();
let s = Struct {};

s.do_something((&a, &b)); // compiles
println!("{}", b); // compiles
}
playground

关于rust - 在Rust中的元组中传递多个引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66088533/

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