2个不稳定版本
0.2.0 | 2018年12月19日 |
---|---|
0.1.0 | 2018年9月14日 |
#7 in #duck
用于 rubber_duck
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