【问题标题】:How to extend the lifetimes of Strings within functions of traits that require returning &str?如何在需要返回 &str 的特征函数中延长字符串的生命周期?
【发布时间】:2016-01-16 14:38:38
【问题描述】:

问题


我正在尝试在枚举上实现 std::error::Error 特征。枚举的一些元素是枚举变体,我想生成一条不同的错误消息,其中包含来自变体的数据。但是,在格式化的String 下面的实现中,Deref&str 的寿命不够长。

一般的解决方案是返回一个String。但是,这不是一个选项,因为返回的类型必须是 &str,由 Error 特征指定。


示例:Playground link


请务必注意,变体可能不包含 usize,而可能是另一个枚举或结构等。

use std::fmt;
use std::fmt::{Display, Formatter};
use std::error;

#[derive(Debug)]
enum EnumError {
    A,
    B(usize),
    C(usize),
    D,
}

impl error::Error for EnumError {
    fn description(&self) -> &str {
        use EnumError::*;
        match *self {
            A => "A happened",
            B(value) => &*format!("B happened info: {:?}", value),
            C(value) => &*format!("B happened info: {:?}", value),
            D => "D happened",
        }
    }
}

impl Display for EnumError {
    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
    use std::error::Error;
        write!(f, "{}", self.description())
    }
}

fn main() {}

【问题讨论】:

  • 不是重复的。引用问题中的答案建议返回一个拥有的字符串 - 这不是一个选项,因为返回类型是由特征指定的。当问题突然关闭时,我正在写这个问题的答案,这非常令人沮丧。我编辑了问题以明确这一点。
  • @Malcolm 根本无法返回在函数内创建的内容的字符串切片。我没有投票赞成关闭,但除了将预先格式化的错误字符串存储在枚举本身中之外,我在这里看不到任何解决方案,这非常笨拙。
  • @VladimirMatveev 您命名了这两个选项,这正是我要回答的内容。那会很有帮助。直接回答一个问题,该问题的答案暗示无法完成的事情根本没有帮助。
  • @Malcolm - 看起来你如愿以偿

标签: enums rust


【解决方案1】:

您创建的字符串需要归某物所有。在方法中创建本地字符串时,必须将其所有权转移给调用者。但是由于你必须返回&str,所以这不是一个选择。

解决方法是将字符串存储在结构本身中。您可以将枚举值声明为B(usize, String),在创建时将描述放在那里,然后返回

B(_, ref descr) => descr

坦率地说,描述不应该是一个非常详细的消息,它只需要对这是什么类型的错误进行一般描述,这就是它返回&str的原因。我没有看到将任何动态数据写入标准库中的描述的实例,通常它只是一个静态字符串。 Display 的实现是另一回事,在那里你可以更加冗长。

【讨论】:

    猜你喜欢
    • 2017-09-07
    • 1970-01-01
    • 2011-02-04
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多