Methods “与”的区别是什么;上下文“;及;带“U上下文”;无论如何?

Methods “与”的区别是什么;上下文“;及;带“U上下文”;无论如何?,methods,error-handling,rust,closures,lazy-evaluation,Methods,Error Handling,Rust,Closures,Lazy Evaluation,这是关于Anyway的文档: ///使用附加上下文包装错误值。 fn上下文(self,context:C)->结果 哪里 C:显示+发送+同步+静态; ///使用延迟计算的附加上下文包装错误值 ///只有一次错误发生。 fn与_上下文(self,f:f)->结果 哪里 C:显示+发送+同步+静态, F:FnOnce()->C; 在实践中,不同之处在于与_context需要一个闭包,如下所示: 无论如何使用:{Context,Result}; fn main()->结果{ // ... it.

这是关于Anyway的文档:

///使用附加上下文包装错误值。
fn上下文(self,context:C)->结果
哪里
C:显示+发送+同步+静态;
///使用延迟计算的附加上下文包装错误值
///只有一次错误发生。
fn与_上下文(self,f:f)->结果
哪里
C:显示+发送+同步+静态,
F:FnOnce()->C;
在实践中,不同之处在于与_context需要一个闭包,如下所示:

无论如何使用:{Context,Result}; fn main()->结果{ // ... it.detach().context(“未能分离重要内容”)?; 让content=std::fs::read(路径) .with_context(| | format!(“无法从{}读取指令,路径))?; // ... } 但是看起来我可以用上下文替换
,用
上下文替换
,通过删除
|
摆脱闭包,程序的行为不会改变

发动机罩下的两种方法有什么区别?

作为国家文件:

使用附加上下文包装错误值,该上下文仅在错误发生时进行延迟计算

如果传递给
context
的内容在计算上可能很昂贵,那么最好将
与\u context
一起使用,因为传递的闭包只有在调用
与\u context
时才会计算。这被称为以懒散而不急切的方式进行评估

标准库中存在类似的行为,例如:

渴望的 懒惰的
提供给
with_context
的闭包是惰性计算的,而您将
with_context
用于
over
context
的原因与您选择惰性计算任何内容的原因相同:它很少发生,而且计算成本很高。一旦这些条件得到满足,则使用上下文的
比上下文的
更可取。注释伪示例:

fn计算\u昂贵的\u上下文()->结果{
//真贵
std::thread::sleep(std::time::Duration::from_secs(1));
待办事项!()
}
//迫不及待地评估昂贵的背景
//执行此功能通常需要1秒以上的时间
//持续糟糕的表现
fn可失败的\u操作\u渴望\u上下文(某些\u结构:结构)->结果{
一些结构
.一些可失败的动作()
.context(计算上下文())
}
//懒散地评估昂贵的上下文
//函数立即返回,失败时只需1+秒
//在一般情况下表现出色,在错误情况下表现糟糕
fn可失败的\u操作\u惰性\u上下文(某些\u结构:结构)->结果{
一些结构
.一些可失败的动作()
.使用|上下文(|计算|上下文())
}

如果您看一下源代码,它与我看到的完全相同。那么在运行时有什么不同吗?我不认为为同一个确切的功能使用两个函数有什么好处。区别在于,一个函数评估可能相当复杂的上下文,即使结果没有错误,而另一个函数只在实际需要该上下文时调用创建该上下文的闭包。这正是带有内容的
文档所提到的:用附加上下文包装错误值,该上下文仅在错误发生时才延迟评估。