1 个不稳定版本
0.0.5 | 2019年6月15日 |
---|
#13 in #named-arguments
用于 duang
5KB
107 行
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);
原始函数仍然可以用常规语法调用
use demo_duang::foo;
assert_eq!(foo(1, 2.0, 3), (1, 2.0, 3));
功能
- 支持泛型和存在类型。
- 友好的错误信息。
常见问题
在默认值中使用局部变量。
为了在其他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
~46K SLoC