7个版本
使用旧的Rust 2015
0.1.6 | 2018年5月13日 |
---|---|
0.1.5 | 2018年3月27日 |
#1179 in 进程宏
8KB
63 行
simple-bind: Rust中的一行非穷举绑定
仅nightly版库。
// Here's a brief example that demonstrates how simple-bind works.
#![feature(proc_macro, pattern_parentheses, stmt_expr_attributes)]
extern crate simple_bind;
use simple_bind::bind;
fn main() {
enum A { Foo(i32), Bar };
// Let's say you have a variant of an enum.
let x = A::Foo(10);
// Previously, if you knew `x` was `Foo` and just wanted to access the inside,
// you had to do either:
let y = match x { A::Foo(y) => y, _ => unreachable!() };
// or...
let y = if let A::Foo(y) = x { y } else { unreachable!() };
// With simple-bind, you can instead do:
bind!{let A::Foo(y) = x;}
// No more nested match/if statements!
assert_eq!(y, 10);
}
设置
此crate的使用依赖于不稳定的功能 proc_macro
API,因此需要nightly和一些功能门。
在您的仓库中启用nightly
rustup override set nightly
将此行添加到您的 cargo.toml
[dependencies]
simple-bind = "0.1.5"
到主模块文件(lib.rs
或 main.rs
),添加
#![feature(proc_macro, pattern_parentheses, stmt_expr_attributes)]
extern crate simple_bind;
然后您想在何处使用宏,使用正常的导入(即非 #[macro_use]
)
use simple_bind::bind;
示例
fn main() {
enum B { Quux(i32) };
enum A { Foo(i32), Bar{y: i32}, Baz(B) };
// Simple binds
bind!{let A::Foo(x) = A::Foo(10);}
// Struct binds
let s = A::Bar{y: 1};
bind!{let A::Bar{y} = s;}
// Nested binds
bind!{let A::Baz(B::Quux(x)) = A::Baz(B::Quux(10));}
// Reference binds
let mut s = A::Foo(10);
bind!{let &mut A::Foo(ref mut y) = &mut s;}
*y = 3;
}
问题
此实现仅涵盖我遇到的情况,并未涵盖所有可能的绑定。如果您发现问题,请随时提交问题或PR!
依赖项
~2MB
~47K SLoC