Rust实现std::fmt::Display trait运行时栈溢出问题如何解决?
问题原因
栈溢出是因为你的Display实现存在无限递归:
- 所有实现了
Displaytrait的类型,Rust标准库都会自动为其实现to_string()方法,to_string()的底层就是调用该类型的fmt方法生成字符串。 - 你在
fmt方法内部直接调用了self.to_string(),相当于每次执行fmt都会触发新一轮的fmt调用,循环永远不会终止,最终耗尽栈空间触发报错。
修复方案
你可以先通过模式匹配拿到枚举变体对应的字符串字面量,再做切片处理即可规避递归:
use std::fmt::{Formatter, Display}; pub enum MyOptions { First, Second, Third, } impl Display for MyOptions { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { let variant_str = match self { MyOptions::First => "First", MyOptions::Second => "Second", MyOptions::Third => "Third", }; write!(f, "{}", &variant_str[1..]) } } fn main() { assert!(format!("{}", MyOptions::First).eq("irst")) }
内容的提问来源于stack exchange,提问作者Vismut
相关产品推荐
相关产品推荐

