gpt4 book ai didi

rust - 在返回位置使用通用关联类型的 Impl trait 会导致生命周期错误

转载 作者:行者123 更新时间:2023-11-29 07:46:43 25 4
gpt4 key购买 nike

我需要在 中存储一个 fn(I) -> O (其中 IO 可以是引用) 'static 结构。 O 需要是具有 'static 通用关联类型的特征,该关联类型也存储在结构中。 IO 本身都不会存储在结构中,因此它们的生命周期无关紧要。但编译器仍在提示 I 活得不够长。

trait IntoState {
type State: 'static;

fn into_state(self) -> Self::State;
}

impl IntoState for &str {
type State = String;

fn into_state(self) -> Self::State {
self.to_string()
}
}

struct Container<F, S> {
func: F,
state: S,
}

impl<I, O> Container<fn(I) -> O, O::State>
where
O: IntoState,
{
fn new(input: I, func: fn(I) -> O) -> Self {
// I & O lives only in the next line of code. O gets converted into
// a `'static` (`String`), that is stored in `Container`.
let state = func(input).into_state();
Container { func, state }
}
}

fn map(i: &str) -> impl '_ + IntoState {
i
}

fn main() {
let _ = {
// create a temporary value
let s = "foo".to_string();

// the temporary actually only needs to live in `new`. It is
// never stored in `Container`.
Container::new(s.as_str(), map)
// ERR: ^ borrowed value does not live long enough
};
// ERR: `s` dropped here while still borrowed
}

playground

最佳答案

据我所知,编译器的错误信息具有误导性,它实际需要的是一个显式定义的关联类型:

fn map(i: &str) -> impl '_ + IntoState<State = String> {
i
}

对问题的出色回答:Why does the compiler not infer the concrete type of an associated type of an impl trait return value?提供了足够的信息说明为什么需要这样做。

另见 Rust issue #42940 - impl-trait return type is bounded by all input type parameters, even when unnecessary

您可以使用泛型类型参数而不是返回 impl,在这种情况下您不必指定关联类型:

fn map<T: IntoState>(i: T) -> T {
i
}

关于rust - 在返回位置使用通用关联类型的 Impl trait 会导致生命周期错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56636442/

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