1 个不稳定版本
0.1.0 | 2020 年 8 月 20 日 |
---|
#14 in #named-arguments
24KB
345 行
named
为 Rust 函数提供命名参数和默认参数值。
⚠️ 警告: 这个包旨在作为一个实验,探索在 Rust 中提供命名参数的潜在方法——虽然它应该可以工作,但我不会特别推荐使用它。特别是,它有显著的局限性(例如不支持在
impl
块中的函数),并且没有真正意图绕过当前语言限制来移除它们。
此过程宏允许您创建可以带命名参数(可选带有默认值)调用的函数。函数必须像宏一样调用,而不是像“真实”函数一样。
use named::named;
#[named(defaults(a = false, b = false))]
fn or(a: bool, b: bool) -> bool {
a || b
}
fn main() {
// You can use defaults for everything:
assert!(!or!());
// Or just for some values:
assert!(or!(a = true));
assert!(or!(b = true));
assert!(!or!(a = false));
assert!(!or!(b = false));
// Or explicitly specify them all:
assert!(or!(a = true, b = false));
assert!(or!(a = false, b = true));
assert!(or!(a = true, b = true));
assert!(!or!(a = false, b = false));
}
参数必须按照与函数中声明相同的顺序指定,因此以下代码是不正确的
use named::named;
#[named(defaults(a = false, b = false))]
fn or(a: bool, b: bool) -> bool {
a || b
}
fn main() {
assert!(or!(b = false, a = true));
}
所有参数都必须提供名称,不能混合使用,因此以下代码是不正确的
use named::named;
#[named(defaults(a = false, b = false))]
fn or(a: bool, b: bool) -> bool {
a || b
}
fn main() {
assert!(or!(a = true, false));
}
并非所有参数都需要默认值;您可以这样做
use named::named;
#[named(defaults(b = false))]
fn or(a: bool, b: bool) -> bool {
a || b
}
fn main() {
assert!(or!(a = true));
assert!(or!(a = true, b = true));
}
任何常量表达式都可以用作默认值
use named::named;
pub struct D {
pub value: u8,
}
const DEFAULT: D = D { value: 1 };
#[named(defaults(a = DEFAULT.value))]
fn is_one(a: u8) -> bool {
a == 1
}
fn main() {
assert!(is_one!());
}
所有的智能操作都在编译时发生,因此运行时此宏会生成普通的函数调用,没有额外的开销。
遗憾的是,目前不能用于在 impl
块中定义的函数,例如那些带有 self
参数的函数。可能后缀宏(postfix macros)可以很好地实现这一点。
依赖项
~2.5MB
~51K SLoC