#函数 #重载 # #参数 # #三个 #多个

无 std function_group

一个将函数重载黑客到 Rust 的宏

8 个版本

0.2.4 2019 年 4 月 9 日
0.2.3 2019 年 4 月 9 日
0.1.2 2019 年 4 月 2 日

#13#重载

每月 34 下载

MIT/Apache

18KB
206

Crates.io Documentation

Function_Group

Function Group 是 Rust 编程语言的一个函数重载宏。该宏允许你定义多个接受可变数量参数的函数!实际上函数仍然只接受一个参数,但它们接受多种类型的元组

函数组可以接受多种类型的参数,甚至可以是递归的。

function_group! {
    fn add -> usize {
        (one : usize, two : usize) {
            one + two
        }
        (one : usize, two : usize, three: usize) {
            add((one, two)) + three
        }
    }
}

assert!(add((5, 5)) == 10);
assert!(add((5, 5, 5)) == 15);

参数可以是可变或不可变的引用。

function_group! {
    fn add_to {
        (one : &mut usize, two : usize) {
            *one += two;
        }
        (one : &mut usize, two : usize, three : usize) {
            *one += two + three;
        }
    }
}

let mut x = 10;
add_to((&mut x, 5));
add_to((&mut x, 5, 5));
assert!(x == 25);

函数组甚至可以与类型关联。在下面的示例中,每个子函数都会传递对 self 的可变引用,并且这些函数将由 TestStruct 类型使用。

struct TestStruct(usize);
function_group! {
    fn add_to_struct(&mut self : TestStruct) {
        (one : usize) {
            self.0 += one;
        }
        (one : usize, two : usize){
            self.0 += one + two; 
        }
    }
}

let mut x = TestStruct(10);
x.add_to_struct((1,2));
assert!(x.0 == 13);

可能的未来特性

  1. 泛型应该可以在每个子函数的基础上实现
  2. 在特质中有一个函数组不太可能

依赖

~2MB
~46K SLoC