hiro99ma blog

Something technical

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


 < Top page


コメント(Google Formへ飛びます)

GitHub

X/Twitter

Homepage