enums - How to extend the lifetimes of Strings within functions of traits that require returning &str? -
problem
i trying implement std::error::error trait on enum. elements of enum enum variants, , generate different error message containing data variant. implementation below formatted string deref &str don't live long enough.
the general solution return string. however, not option here returned type must &str specified error trait.
example: playground link
it important note variants may not contain usize, , might instead enum, or struct etc.
use std::fmt; use std::fmt::{display, formatter}; use std::error; #[derive(debug)] enum enumerror { a, b(usize), c(usize), d, } impl error::error enumerror { fn description(&self) -> &str { use enumerror::*; match *self { => "a happened", b(value) => &*format!("b happened info: {:?}", value), c(value) => &*format!("b happened info: {:?}", value), d => "d happened", } } } impl display enumerror { fn fmt(&self, f: &mut formatter) -> fmt::result { use std::error::error; write!(f, "{}", self.description()) } } fn main() {}
the string create needs owned something. when create local string in method, have transfer ownership caller. since have return &str, not option.
the way around store string in struct itself. can declare enum value b(usize, string), put description there when create it, , return with
b(_, ref descr) => descr to frank, description not supposed terribly detailed message, needs give general description of kind of error is, why returns &str. didn't see instances of writing dynamic data description in standard library, it's static string. display implementation different matter though, in there can more verbose.
Comments
Post a Comment