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

在Rust中传递元组中的多个引用,rust,reference,tuples,lifetime,borrow-checker,Rust,Reference,Tuples,Lifetime,Borrow Checker,我有一个与某个关联类型相关的trait,它的一些函数将该类型的引用作为输入: trait{ 类型值; fn做某事(&self,value:&self::value); } 在实现此特性的一个结构中,Value是一个元组,因为我需要将多个值传递给do\u something: struct结构{} 结构的impl特征{ 类型值=(i64,字符串); fn do_something(&self,(a,b):&(i64,String)){ println!(“{}{}”,a,b); } } 然而,

我有一个与某个关联类型相关的trait,它的一些函数将该类型的引用作为输入:

trait{
类型值;
fn做某事(&self,value:&self::value);
}
在实现此特性的一个结构中,
Value
是一个元组,因为我需要将多个值传递给
do\u something

struct结构{}
结构的impl特征{
类型值=(i64,字符串);
fn do_something(&self,(a,b):&(i64,String)){
println!(“{}{}”,a,b);
}
}
然而,当我在实践中使用
Struct
时,我遇到了麻烦。要么我这样做:

fn main(){
设a=10;
让b=“foo.”to_owned();
设s=Struct{};
s、 做点什么(&(a,b));//这很有效。。。
println!(“{}”,b);/…但是借书人在这里抱怨
}
但是我失去了元组中任何非Copy类型的所有权。或者,我可以这样做:

fn main(){
设a=10;
让b=“foo.”to_owned();
设s=Struct{};
设t=(a,b);
s、 做点什么(&t);
设(a,b)=t;
println!(“{}”,b);
}
这是可行的,但语法非常繁重

有没有人知道我如何以更简洁的方式实现我的目标?我试图将
Struct::Value
类型设置为
(&i64,&String)
,但是借用检查器抱怨这些引用需要一个生命周期,如果可能的话,我希望避免

我尝试的另一种选择是使用类型参数(因此,
Trait
)而不是关联的类型。在这种情况下,我可以拥有
Struct
implement
Trait
,而不会出现与关联类型相关的生存期问题。它可以工作,但在我的项目中,
Struct
拥有多个
Trait
实现是没有意义的,所以我更喜欢使用关联类型

谢谢您的时间:-)

我试图将
Struct::Value
类型设置为
(&i64,&String)
,但是借用检查器抱怨这些引用需要一个生命周期,如果可能的话,我希望避免

这是不可能避免一生的。所有引用都有生命周期,编译器可以为您推断其中一些生命周期,而您必须显式地为自己添加注释。注意:编译器并不总是正确的,因此尽管编译器进行了推断,有时还是必须显式地注释生存期

在这种情况下,我可以拥有
Struct
implement
Trait
,而不会出现与关联类型相关的生存期问题

是的,因为编译器为这些引用推断出的生命周期恰好起作用,但您不应该害怕在需要时自己显式地注释它们

它可以工作,但在我的项目中,
Struct
拥有多个
Trait
实现是没有意义的,所以我更喜欢使用关联类型

好的,那么让我们使用一个关联的类型。以下是包含所有必需的生命周期注释的代码:


trait trait在上面的第一个示例中,您不能使用
b.clone()
获取字符串的副本吗?这不太理想,但可能对您的案例有用!谢谢!我想我仍然觉得终生注释有点可怕,尤其是它们往往会爬到任何地方,所以我总是不愿意使用它们。。。但我没有想到,无论如何,总有一个生命周期,只是有时候编译器会自动为我添加它。是的!我强烈推荐阅读,我想你会发现它有助于揭开人生的神秘面纱。免责声明:我写的。这是非常广泛的:0谢谢!