gpt4 book ai didi

rust - 如何创建一个大小合适的闭包或在结构上实现 Fn/FnMut/FnOnce?

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

基本上,我想编写一个返回闭包的函数。我怎样才能做到这一点而不必返回 Box<FnOnce(u32)>

来自closures chapter of the rust book ,我读到闭包只是结构的语法糖和 FnOnce 的实现。 .这是我的尝试:

#[derive(Debug)]
struct MyError {
code: u32,
location: &'static str,
}
// Here is my closure:
struct MyErrorPartial {
location: &'static str,
}
impl FnOnce(u32) for MyErrorPartial {
type Output = MyError;

fn call_once(self, args: u32) -> MyError {
MyError {
code: args,
location: self.location,
}
}
}
fn error_at(location: &'static str) -> MyErrorPartial {
MyErrorPartial {location: location}
}

fn function_returning_code() -> Result<(), u32> {
Err(123)
}
fn function_with_error() -> Result<(), MyError> {
try!(function_returning_code().map_err(error_at("line1")));
try!(function_returning_code().map_err(error_at("line2")));
Ok(())
}
fn main() {
function_with_error().unwrap();
}

目前报错:

<anon>:11:12: 11:17 error: associated type bindings are not allowed here [E0229]
<anon>:11 impl FnOnce(u32) for MyErrorPartial {
^~~~~

最佳答案

在结构上手动实现 Fn* 特征的语法是这样的:

impl FnOnce<(Arg1,Arg2,Arg3,)> for MyStruct {
type Output = MyOutput;
extern "rust-call" fn call_once(args: (Arg1, Arg2, Arg3,)) -> MyOutput {
// implementation here
}
}

请注意,所有参数都作为单个元组给出。

此外,此语法不稳定,需要 #![feature(core, unboxed_closures)],因此您不能在 beta channel 上使用它,只能在 nightlies 上使用。

在你的例子中,它会这样翻译:

impl FnOnce<(u32,)> for MyErrorPartial {
type Output = MyError;

extern "rust-call" fn call_once(self, args: (u32,)) -> MyError {
MyError {
code: args.0,
location: self.location,
}
}
}

关于rust - 如何创建一个大小合适的闭包或在结构上实现 Fn/FnMut/FnOnce?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29553877/

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