gpt4 book ai didi

rust - 将类型注释添加到 "the ` 时出现 ` method cannot be invoked on a trait object"and_then `and_then` 错误

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

我有一个传递给 and_then 的函数,它返回编译器未知的类型。当与其他选项方法链接时,需要类型注释。

fn main() {
let w = Some("hi".to_string());
let x: Option<&String> = w.as_ref();

//fails:
let y: Option<String> =
x.and_then::<String, FnOnce(Option<&String>) -> Option<String>>(|_inner: &String| None);

//ok:
let y: Option<String> = x.and_then(|_inner: &String| None);
}

playground

添加强制注释会导致此编译器错误:

error: the `and_then` method cannot be invoked on a trait object
--> src/main.rs:7:11
|
7 | x.and_then::<String, FnOnce(Option<&String>) -> Option<String>>(|_inner: &String| None);
| ^^^^^^^^

我假设它是在提示 FnOnce 特性,但我不明白这与 x 有什么关系。

我想了解这里出了什么问题。

最终,目标是将此 and_then 放在链式语句中,这就是需要注释的原因。

let y = x
.and_then::<String, FnOnce(Option<&String>) -> Option<String>>(|_inner: &String| None)
.and(Some("new String".to_string()));

最佳答案

这里有多个问题:

  • 闭包是一个 anonymous type ,这意味着您无法命名它们

  • 目前不可能有像 FnOnce 这样的裸特征,因为 it is unsized .

  • || foo 不是特征,而是具体类型。

相反,specify the return type of the closure :

let y = x
.and_then(|_inner| -> Option<String> { None })
.and(Some("new String".to_string()));

qualify the type of the None :

let y = x
.and_then(|_inner| None::<String>)
.and(Some("new String".to_string()));

或者避免链接:

let y: Option<String> = x.and_then(|_inner| None);
let y = y.and(Some("new String".to_string()));

关于rust - 将类型注释添加到 "the ` 时出现 ` method cannot be invoked on a trait object"and_then `and_then` 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53660432/

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