ys memos

Blog

Rustの関数に様々な型を渡せるようにする方法


rust

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);
}


関連タグを探す