2024/08/25
はじめに
Rustの関数に様々な型を渡せるようにする方法を紹介します。
方法
Into<Hoge>
を実装しておき、関数の引数を Into<Hoge>
にすることで、関数の呼び出し側ではその変換を省略して渡すことができる。
コード例
Animal
という構造体に変換できる Dog
, Cat
という構造体を定義し、その変換を用いて多様な引数を受け取る関数を作成する。
struct Animal {
kind: String,
name: String,
age: u8,
}
struct Dog {
name: String,
age: u8,
}
impl From<Dog> for Animal {
fn from(dog: Dog) -> Animal {
Animal {
kind: "dog".to_string(),
name: dog.name,
age: dog.age,
}
}
}
struct Cat {
name: String,
age: u8,
}
impl From<Cat> for Animal {
fn from(cat: Cat) -> Animal {
Animal {
kind: "cat".to_string(),
name: cat.name,
age: cat.age,
}
}
}
fn print(target: impl Into<Animal>) {
let animal = target.into();
println!(
"kind: {}, name: {}, age: {}",
animal.kind, animal.name, animal.age
);
}
fn main() {
let dog = Dog {
name: "Pochi".to_string(),
age: 3,
};
let cat = Cat {
name: "Tama".to_string(),
age: 2,
};
print(dog);
print(cat);
}