LoginSignup
10
0

More than 5 years have passed since last update.

rust 簡単なオーバーロードをする overload

Posted at

やりたいこと

  • 同じ数の引数、違う型の引数で関数を呼ぶ
over_load(0);
over_load(1.2);
  • 違う数の引数、同じ型の引数で関数を呼ぶ
over_load(0);
over_load(1, 2);
  • 違う数の引数、違う型の引数で関数を呼ぶ
over_load(3, 1.2);
over_load('a', "bcd", "efg".to_string());

version

image.png

どうやるか?

異なるタプル型のメソッドを用意し、traitでまとめます。
なので、Unit-like 構造体を用意し引数はタプル型で渡します。

Type::over_load(0); //引数一つはタプル型にしなくて良い
Type::over_load((1, 2));
Type::over_load((3, 1.2));
Type::over_load(('a', "bcd", "efg".to_string()));

一つのファイルの場合

main.fn
struct Type;

trait Overload<T> {
    fn over_load(T);
}

impl Overload<i32> for Type {
    fn over_load(args: i32){
        println!("i32: {}", args);
    }
}

impl Overload<(i32, i32)> for Type {
    fn over_load(args: (i32, i32)) {
        println!("i32: {}, i32: {}", args.0, args.1);
    }
}

impl Overload<(i32, f64)> for Type {
    fn over_load(args: (i32, f64)) {
        println!("i32: {}, f64: {}", args.0, args.1);
    }
}

impl<'a> Overload<(char, &'a str, String)> for Type {
    fn over_load(args: (char, &str, String)) {
        println!("char: {}, &str: {}, String: {}", args.0, args.1, args.2);
    }
}

fn main() {
    Type::over_load(0);
    Type::over_load((1, 2));
    Type::over_load((3, 1.2));
    Type::over_load(('a', "bcd", "efg".to_string()));
}

image.png

ファイルを分割する場合

main.fn
mod overload;
use overload::{Type, Overload};

fn main() {
    Type::over_load(0);
    Type::over_load((1, 2));
    Type::over_load((3, 1.2));
    Type::over_load(('a', "bcd", "efg".to_string()));
}
overload.fn
pub struct Type;

pub trait Overload<T> {
    fn over_load(T);
}

impl Overload<i32> for Type {
    fn over_load(args: i32){
        println!("i32: {}", args);
    }
}

impl Overload<(i32, i32)> for Type {
    fn over_load(args: (i32, i32)) {
        println!("i32: {}, i32: {}", args.0, args.1);
    }
}

impl Overload<(i32, f64)> for Type {
    fn over_load(args: (i32, f64)) {
        println!("i32: {}, f64: {}", args.0, args.1);
    }
}

impl<'a> Overload<(char, &'a str, String)> for Type {
    fn over_load(args: (char, &str, String)) {
        println!("char: {}, &str: {}, String: {}", args.0, args.1, args.2);
    }
}

まとめ

自明でした

10
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
0