#parameters #named #default #named-arguments

duang

使用宏在Rust中提供默认参数和命名参数

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)

MIT 许可证

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