Здравствуйте,
Допустим у меня есть image::ImageFormat::JPEG Или любой другой формат из этого Enum,
Как преобразовать его в строку (String / &str)? в "jpg" / "png" итд. Я так догадываюсь что вроде через fmt можно, но не понял как…
Спасибо
Самый простой способ - использовать типаж Debug:
#[derive(Debug)]
enum ImageFormat {
Jpeg,
Png,
}
fn main() {
let i = ImageFormat::Jpeg;
let s = format!("{:?}", i);
assert_eq!(s, "Jpeg");
}
Playground
Если нужно более гибкое/точное форматирование, тогда лучше реализовать Display:
enum ImageFormat {
Jpeg,
Png,
}
impl std::fmt::Display for ImageFormat {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
let s = match self {
ImageFormat::Jpeg => "jpeg",
ImageFormat::Png => "png",
};
write!(f, "{}", s)
}
}
fn main() {
let i = ImageFormat::Jpeg;
let s = format!("{}", i);
assert_eq!(s, "jpeg");
}
Playground
Оба способа выше возвращают String, т.е. выделяют память в куче. Если нужен просто &str, то хватит и простого match как в реализации Display выше - там будут использоваться просто статические строковые литералы ('static str).
Если речь идёт о крейтер image, то ImageFormat уже реализует Debug и можно сделать так:
let format = ImageFormat::PNG;
let s: String = format!("{:?}", format);
Да, у этой либы есть стнандартный дебаг, но у меня что-то не получилось переопределить его таким способом. Но позже я решил и не пытаться, по тому что не уверен стоит ли стандартные вещи переопределять, и сделать просто функцией
Стандартный дебаг мне бы подошел, но к сожалению он возвращает "jpeg" вместо "jpg"
fn image_format_to_string(image_format: ImageFormat) -> String {
match image_format {
ImageFormat::JPEG => "jpg".to_string(),
ImageFormat::PNG => "png".to_string(),
_ => unreachable!(),
}
}
А переопределить Debug для того же типа и нельзя. Лучше как раз как ты сделал - просто функцию специализированную написать и жить себе спокойно.