Почему ширина игнорируется для моей пользовательской реализации форматера? - PullRequest
2 голосов
/ 30 июня 2019

Когда у меня реализовано перечисление с Display, и я пытаюсь напечатать его в формате, ширина, которую я даю, игнорируется.

use std::fmt;
enum TestEnum {
    A,
    B,
}

impl fmt::Display for TestEnum {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
            TestEnum::A => write!(f, "A"),
            TestEnum::B => write!(f, "B"),
        }
    }
}

fn main() {
    println!("-{value:>width$}-", value = TestEnum::A, width = 3);
}

Я ожидаю, что он выведет - A-, но он выдаст-A-.

Если я заменяю значение на фактическую строку вместо перечисления, это делает правильно,

println!("-{value:>width$}-", value = "A", width = 3);

выводит

-  A-

Почемуширина игнорируется?Что мне нужно сделать по-другому?

1 Ответ

7 голосов
/ 30 июня 2019

Используя write! в вашей реализации fmt, вы переопределяете формат, предоставленный вызывающей стороной.

Вместо этого вы должны вызвать fmt для самих строк:

impl fmt::Display for TestEnum {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
            TestEnum::A => "A".fmt(f),
            TestEnum::B => "B".fmt(f),
        }
    }
}

( Постоянная ссылка на игровую площадку )

Это будет правильно печатать - A-.

...