🦀

【Rust】関数の引数でString/&strどちらでも受け取れるようにする。

2022/09/29に公開

Rust関数の引数にStringや&strをどちらでも対応したい場合の実装方法を紹介

サンプルコード

fn echo<T: Into<String>>(
    value: T,
) {
    let value = value.into(); // String
    println!(value);
}
fn main(){
    echo("&str");
    echo("String".to_string());
}

やってること

RustにはtraitでFrom/Intoを実装することで、構造体を明示的に変換することができます。
イメージとしてはUserをStringに変換したいときに、Into<String>を定義することで振る舞い定義することができます。

struct User{
   name: String
}
impl Into<String> for User {
    fn into(self) -> String {
        self.name.to_string()
    }
}
fn main(){
    let user = User{name:"rust".to_string()};
    let name:String = user.into();
    println!(name);
}

Intoを上手く使うことで複数の構造体をまとめて受け取れる関数を実装することが可能です。

Discussion