やりたいこと
- 同じ数の引数、違う型の引数で関数を呼ぶ
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
どうやるか?
異なるタプル型のメソッドを用意し、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()));
}
ファイルを分割する場合
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);
}
}
まとめ
自明でした