#default #named #macro #duck #arg #nightly #function

rubber_duck_macro

为橡胶鸭crate提供的进程宏(构建命名参数函数的宏)

2个不稳定版本

0.2.0 2018年12月19日
0.1.0 2018年9月14日

#7 in #duck


用于 rubber_duck

MIT 许可证

33KB
864

橡胶鸭

橡胶鸭是一个库,用于简化编写可使用命名值语法(以及可选的默认值)调用的函数 - 需要nightly版本。

有关用法信息,请参阅橡胶鸭crate的rust文档。不过,您需要检出此仓库并构建文档,以下是一个示例

// Given this api declaration:
mod module {
   #[gen_struct_sugar(
        defaults(greeting = r#""Hello.""#),
        positionals(name),
    )]
   pub fn is_a_test(name: &'static str, greeting: &'static str, message: &'static str) -> String {
       format!("Dear {}, {}. {}", &name, &greeting, &message)
   }
}

// One can call the function in a variety of ways
mod stable{
    use crate::{n,module::is_a_test};
    // Named form requires a macro
    n!(is_a_test{"George", {greeting: "Hi.", message: "Rust is cool."}});   // Dear George, Hi. Rust is cool.
    // and lets you use defaults                                   
    n!(is_a_test{"George", {message: "Hi."}});                              // Dear George, Hello. Rust is cool.
    // and even lets you use sugar (you need a trailing comma if there's only one named arg
    let message = "Struct Sugar";                                           // Dear George, Hello. Struct Sugar
    n!(is_a_test{"George", {message,}}) 
 
    // Positional form doesn't need a macro, but args with defaults are wrapped in the option type
    // Override the default
    is_a_test("Bob", Some("Hi."), "Goodbye.");                              // Dear Bob, Hi. Goodbye.
    // Use the default
    is_a_test("Bob", None, "Goodbye.");                                     // Dear Bob, Hello. Goodbye. 
}

//There's also a slightly nicer way on nightly (behind the features=["nightly"] flag)
mod nightly_only {
    use crate::module::is_a_test;
     // Named form requires a macro
    is_a_test!("George", greeting=> "Hi.", message=> "Rust is cool");        // Dear George, Hi. Rust is cool.
     // and lets you use defaults                                   
    is_a_test!("George", message=> "Rust is cool");                          // Dear George, Hello. Rust is cool.  
}
// You don't even have to import it!
crate::module::is_a_test!("George", greeting=> "Hi.", message=> "Rust is cool");

请参阅REVIEW.md以了解有关先前命名和默认函数参数RFC的通用审查和讨论。

其他信息

不想想一个长的描述性名称,或者使用一个好的名称,我选择了橡胶鸭。我想探索命名和默认参数的选项。我希望它能促进语言中添加它们的RFC进程。

它向函数添加两种主要调用方法(在impls或与traits中使用时不起作用)。

在稳定和nightly版本中,您可以使用n!宏来包装函数调用并获取命名/默认参数调用能力。

在nightly版本中,命名和默认参数调用语法作为声明2.0宏导出,位置与您编写的函数相同。

如果您对此感兴趣,您还可能想查看comex的namedarg crate。

依赖项

~2MB
~46K SLoC