gpt4 book ai didi

enums - 如何在需要返回 &str 的特征函数中延长字符串的生命周期?

转载 作者:行者123 更新时间:2023-11-29 08:05:24 25 4
gpt4 key购买 nike

问题


我正在尝试实现 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() {}

最佳答案

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

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

返回它
B(_, ref descr) => descr

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

关于enums - 如何在需要返回 &str 的特征函数中延长字符串的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34828202/

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