Rust 结果<;T、 E>;键入锈迹。为什么引用可以';不能作为t或E传递?

Rust 结果<;T、 E>;键入锈迹。为什么引用可以';不能作为t或E传递?,rust,rust-lifetimes,Rust,Rust Lifetimes,我是个新手,最近我读到了关于结果类型的文章。 喜欢这个概念,并开始在我的应用程序中使用它 我的第一次尝试是使用&str。因此我的返回类型如下所示: pub fn calculate_risk_score(a: i32, b: i32) -> Result<i32, &str> { return Ok(a + b); } if let Err(e) = calculate_risk_score(foo, bar) { // `e` is &str

我是个新手,最近我读到了关于结果类型的文章。 喜欢这个概念,并开始在我的应用程序中使用它

我的第一次尝试是使用&str。因此我的返回类型如下所示:

pub fn calculate_risk_score(a: i32, b: i32) -> Result<i32, &str> {
    return Ok(a + b);
}
if let Err(e) = calculate_risk_score(foo, bar) {
    // `e` is &str - who is it borrowed from, and how long is it valid?
    // Can I put it in a container? Can I return it from this function?
    // Can I put it in a global variable?
    ...
}
pub fn计算风险评分(a:i32,b:i32)->结果{
返回Ok(a+b);
}
这就是我得到的错误:

以下代码起作用:

pub fn calculate_risk_score(a: i32, b: i32) -> Result<i32, &'static str> {
    return Ok(a + b);
}

pub fn计算风险评分(a:i32,b:i32)->结果1。为什么
“静态”
终身有效?

“静态”
生存期有效,因为它意味着引用值在程序的整个生存期内都有效。Rust中直接在源代码中写入的每个字符串的生命周期都是静态的。
,因为它包含在已编译的二进制文件中,因此不会被删除

2。为什么使用显式生存期以及如何修复?

编译器无法计算返回值的生存期,因为它需要显式的生存期。一个简单的修复方法是返回一个拥有的字符串(
string
type),而不是一个借用的字符串,或者只使用
&'static str


我建议您阅读并更好地了解锈迹中的寿命是如何工作的。

要了解此函数签名的问题:

pub fn calculate_risk_score(a: i32, b: i32) -> Result<i32, &str> {
    todo!()
}
生存期通过将返回的借用的生存期连接到由调用方提供的输入参数的生存期来提供这些问题的答案,因此其范围必须是已知的。这通常与
self
的范围一样简单:

struct Parser {
    last_error: String,
    // ...
}

impl Parser {
    // Equivalent to fn calculate_risk_scope<'a>(&'a self, a: i32, b: i32) -> Result<i32, &'a str>
    fn calculate_risk_scope(&self, a: i32, b: i32) -> Result<i32, &str> {
        if error {
            return Err(self.last_error.as_str());
        }
        ...
    }
}
struct解析器{
最后一个错误:字符串,
// ...
}
impl解析器{

//相当于fn calculate_risk_scope Result results这能回答您的问题吗?编译器通常可以计算返回引用的生存期,但只有当存在与参数相关联的生存期时才可以。i32没有任何生存期,编译器不会推断它是静态的。对于您来说,您必须是显式的如果涉及到多个生命周期,您可能希望对返回的引用进行注释,以确保其正确性。
Result
是一个模糊的问题,它不会以任何方式影响引用或生命周期。@kmdreko您是对的,但我想我从Aykut Yilmas那里得到的答案比帖子中的答案要好得多。是有没有办法把答案移到那边去?@kmdreko现在这个帖子里有两个很好的答案,也许我最好编辑这个问题,把结果从标题中删除。WDYT?