1 个不稳定版本

0.0.5 2019年6月15日

#13 in #named-arguments


用于 duang

MIT 许可证

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