Преобразовать image::ImageFormat в строку


#1

Здравствуйте,

Допустим у меня есть image::ImageFormat::JPEG Или любой другой формат из этого Enum,
Как преобразовать его в строку (String / &str)? в "jpg" / "png" итд. Я так догадываюсь что вроде через fmt можно, но не понял как…

Спасибо


#2

Самый простой способ - использовать типаж 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).


#3

Если речь идёт о крейтер image, то ImageFormat уже реализует Debug и можно сделать так:
let format = ImageFormat::PNG;
let s: String = format!("{:?}", format);


#4

Да, у этой либы есть стнандартный дебаг, но у меня что-то не получилось переопределить его таким способом. Но позже я решил и не пытаться, по тому что не уверен стоит ли стандартные вещи переопределять, и сделать просто функцией

Стандартный дебаг мне бы подошел, но к сожалению он возвращает "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!(),
    }
}

#5

А переопределить Debug для того же типа и нельзя. Лучше как раз как ты сделал - просто функцию специализированную написать и жить себе спокойно.