gpt4 book ai didi

Rust 对特征实现的自动类型推断

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

我真的不明白我下面的代码有什么问题。反正不是很清楚。我曾经用一生来参数化 Toto,但我想我会试一试终生推理。问题似乎与对 self 的引用有关。我收到编译器错误:

embedded_lifetimes.rs:11:5: 11:10 error: cannot infer an appropriate lifetime for automatic coercion due to conflicting requirements
embedded_lifetimes.rs:11 slice
^~~~~
embedded_lifetimes.rs:10:3: 12:4 help: consider using an explicit lifetime parameter as shown: fn klax<'a>(&'a self, slice: &'a [String]) -> &[String]
embedded_lifetimes.rs:10 fn klax(&self, slice: &[String]) -> &[String] {
embedded_lifetimes.rs:11 slice
embedded_lifetimes.rs:12 }

对于下面的代码:

#![feature(slicing_syntax)]

trait Toto {
fn klax(&self, &[String]) -> &[String];
}

struct Tata;

impl Toto for Tata {
fn klax(&self, slice: &[String]) -> &[String] {
slice
}
}

fn main() {
let t = Tata;
t.klax(&["myello".to_string()]);
}

最佳答案

您需要将您的特质改回:

trait Toto<'a> {
fn klax(&self, &'a [String]) -> &'a [String];
}

As I understand it ,如果你放弃所有的生命周期,生命周期省略将产生:

trait Toto<'a> {
fn klax(&'a self, &[String]) -> &'a [String];
}

也就是说,您返回属于对象String 片段。但是,您希望结果来自输入,这不是默认规则会给出的结果。

编辑

建议更改为

fn klax<'a>(&'a self, slice: &'a [String]) -> &[String]

表示您的对象输入 具有相同的生命周期。结果生命周期也将是 'a(根据省略规则),因此返回输入将适合生命周期。如果这对您的情况有意义并且您要进行此更改,则会收到错误:

method `klax` has an incompatible type for trait: expected concrete lifetime, found bound lifetime parameter

因为现在您的特征和该特征的实现不再匹配。

关于Rust 对特征实现的自动类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27350295/

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