impl <T: Display>와 impl <T: Display::ToString>의 차이Rust에서 impl<T: Display>는 T가 Display 트레이트를 구현한 타입에 대해 T 타입에 대한 메서드를 구현한다는 의미입니다. 그리고 impl<T: Display::ToString>는 잘못된 문법입니다. 이유는 ToString이 Display 트레이트에 속한 트레이트가 아니라 독립적인 트레이트이기 때문입니다.
impl<T: Display::ToString>를 사용하지 않는지?Display와 ToString은 서로 다른 트레이트로, Display 트레이트를 구현하는 타입에 대해 ToString을 구현하는 방식입니다.ToString은 Display 트레이트를 구현한 타입에 대해 자동으로 구현되며, 이를 위해 impl<T: Display> ToString for T와 같이 ToString을 별도로 구현합니다.Display::ToString과 같은 구문은 잘못된 문법입니다. ToString은 Display 트레이트 안에 속한 것이 아니라, 독립적인 트레이트이기 때문에 Display::ToString 같은 방식으로 구현할 수 없습니다.impl<T: Display> ToString for Timpl<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 T는 T 타입이 Display 트레이트를 구현하면 ToString 트레이트를 자동으로 구현하는 방식입니다. 이 구문이 올바른 문법입니다.
Rust에서는 ToString이 Display 트레이트를 구현한 타입에 대해 자동으로 구현되는 트레이트이기 때문에, 이를 사용하려면 별도로 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)
}
이 코드에서 MyStruct는 Display를 구현한 타입이고, 그래서 ToString 트레이트가 자동으로 구현됩니다. 이로 인해 to_string() 메서드를 바로 사용할 수 있게 됩니다.
impl<T: Display::ToString>와 같은 문법은 존재하지 않습니다. 대신, impl<T: Display> ToString for T와 같이 Display 트레이트를 구현한 타입에 대해 ToString 트레이트를 구현하는 방식이 맞습니다. ToString은 독립적인 트레이트이기 때문에 Display::ToString처럼 네임스페이스를 사용하는 형태로 구현하지 않습니다.