rust impl

agnusdei·2025년 2월 6일

impl <T: Display>impl <T: Display::ToString>의 차이

Rust에서 impl<T: Display>TDisplay 트레이트를 구현한 타입에 대해 T 타입에 대한 메서드를 구현한다는 의미입니다. 그리고 impl<T: Display::ToString>는 잘못된 문법입니다. 이유는 ToStringDisplay 트레이트에 속한 트레이트가 아니라 독립적인 트레이트이기 때문입니다.

impl<T: Display::ToString>를 사용하지 않는지?

  • DisplayToString서로 다른 트레이트로, Display 트레이트를 구현하는 타입에 대해 ToString을 구현하는 방식입니다.
  • ToStringDisplay 트레이트를 구현한 타입에 대해 자동으로 구현되며, 이를 위해 impl<T: Display> ToString for T와 같이 ToString을 별도로 구현합니다.
  • Display::ToString과 같은 구문은 잘못된 문법입니다. ToStringDisplay 트레이트 안에 속한 것이 아니라, 독립적인 트레이트이기 때문에 Display::ToString 같은 방식으로 구현할 수 없습니다.

정확한 문법: impl<T: Display> ToString for T

impl<T: Display> ToString for T {
    fn to_string(&self) -> String {
        let mut buf = String::new();
        write!(&mut buf, "{}", self).unwrap(); // Display 트레이트를 사용하여 문자열로 변환
        buf
    }
}

여기서 impl<T: Display> ToString for TT 타입이 Display 트레이트를 구현하면 ToString 트레이트를 자동으로 구현하는 방식입니다. 이 구문이 올바른 문법입니다.

왜 이렇게 하는지?

Rust에서는 ToStringDisplay 트레이트를 구현한 타입에 대해 자동으로 구현되는 트레이트이기 때문에, 이를 사용하려면 별도로 ToString을 명시적으로 구현할 필요 없이, Display만 구현하면 to_string() 메서드를 자동으로 사용할 수 있습니다.

예시

use std::fmt::Display;

struct MyStruct {
    value: i32,
}

impl Display for MyStruct {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        write!(f, "MyStruct({})", self.value)
    }
}

// `Display`가 구현되었으므로 `ToString`이 자동으로 구현됩니다.

fn main() {
    let my_value = MyStruct { value: 42 };
    let string_rep = my_value.to_string(); // `to_string()`을 사용할 수 있습니다.
    println!("{}", string_rep);  // MyStruct(42)
}

이 코드에서 MyStructDisplay를 구현한 타입이고, 그래서 ToString 트레이트가 자동으로 구현됩니다. 이로 인해 to_string() 메서드를 바로 사용할 수 있게 됩니다.

결론

impl<T: Display::ToString>와 같은 문법은 존재하지 않습니다. 대신, impl<T: Display> ToString for T와 같이 Display 트레이트를 구현한 타입에 대해 ToString 트레이트를 구현하는 방식이 맞습니다. ToString독립적인 트레이트이기 때문에 Display::ToString처럼 네임스페이스를 사용하는 형태로 구현하지 않습니다.

profile
DevSecOps Pentest🚩

0개의 댓글