rust: Rustがんばろう 12日目
2025/04/11
はじめに
ようやく「トレイト」の話が出てきた。
10章
ジェネリック
C++ みたいに <T> 形式で書くことができる。
メソッドは impl にも <T> がいるし struct 名にも <T> がいる。
struct の方で <T> を使ったからといって impl も同じである必要はなかった。
struct Abc<T> {
abc: T
}
impl<U> Abc<U> {
fn abc(&self) -> &U {
&self.abc
}
}
fn main() {
let abc = Abc { abc: 123 };
println!("{}", abc.abc());
}
impl<T> Abc<U> はダメだったし、どちらか片方の <> を外すのもダメだった。
impl<T> は “T型は具体的な型名ではない” という意味だそうで、一部だけ具体的な型名にすることもできる。
struct Abc<T, U> {
abc: T,
def: U,
}
impl<U> Abc<U, i32> {
fn abc(&self) -> &U {
&self.abc
}
fn def(&self) -> &i32 {
&self.def
}
}
fn main() {
let abc = Abc { abc: "$%&", def: 456 };
println!("{}, {}", abc.abc(), abc.def());
}
もし 2番目を i32 以外にするとこの impl は適用されない。
別の型にした impl を追加するとそちらが反映されるようだ。
......
impl<U> Abc<U, &str> {
fn abc(&self) -> &U {
&self.abc
}
fn def(&self) -> &str {
&self.def
}
}
......
let abc = Abc { abc: 123, def: "$%%" };
println!("{}, {}", abc.abc(), abc.def());
......
ここで impl<T, U> にすると型を指定した方の impl と duplicate になってしまう。
writer: hiro99ma