#named-arguments #function #default-value #default #arguments #proc-macro #impl-block

named

过程宏,允许您创建可以带命名参数(可选带有默认值)调用的函数

1 个不稳定版本

0.1.0 2020 年 8 月 20 日

#14 in #named-arguments

BSD-3-Clause 许可协议

24KB
345

named

为 Rust 函数提供命名参数和默认参数值。

crates.io Documentation Build Status

⚠️ 警告: 这个包旨在作为一个实验,探索在 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