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 になってしまう。