3个版本
0.1.2 | 2019年6月15日 |
---|---|
0.1.1 | 2019年6月15日 |
0.1.0 | 2019年6月15日 |
#15 in #named-arguments
每月50次下载
在 2 个crate中使用 (通过 demo-duang)
38KB
968 行
duang
Rust不支持默认函数参数和命名函数参数。
此crate为给定函数生成一个宏接口,该接口可以使用命名参数调用并填充默认参数,同时保持旧函数不变。
生成宏接口
为了生成函数的宏,我们只需要用 duang!{...}
包装定义。
use duang::duang;
duang!(
pub fn foo<T>(a: T,b: f64 = 13.0, c: T = a*a) -> (T,f64,T)
where
T: std::ops::Mul<T, Output = T>,
T: std::fmt::Display,
T: Copy,
{
(a,b,c)
}
);
调用
use demo_duang::foo;
// pass
assert_eq!(foo!(1, c = 30, b = -2.0), (1, -2.0, 30));
// pass
assert_eq!(foo!(a = 10), (10, 13.0, 100));
// fail
// foo!(1,c=30,c=2);
功能
- 支持泛型和存在类型。
- 友好的错误信息。
常见问题
在默认值中使用局部变量。
为了在其他crate中使用生成的宏,用户应添加 $crate
和使用变量的路径。此外,该变量应为宏调用作用域可见(pub
)。
mod bar {
use duang::duang;
pub static NUM: i32 = 42;
duang!(
pub fn foo(a: i32 = $crate::bar::NUM) -> i32 { a }
);
}
fn main() {
use bar::foo;
assert_eq!(foo!(), 42);
}
限制
- 不支持关联函数。
- 在模式参数中不能使用通配符。例如
fn foo((a,_): (i32, i32))
是非法的。
待办事项
- 为函数或宏生成文档。
- 在“正式函数参数位置的属性” (#60406) 稳定后,将函数类似宏改为属性类似宏。
许可证:MIT
依赖关系
~2MB
~45K SLoC