7个版本

使用旧的Rust 2015

0.1.6 2018年5月13日
0.1.5 2018年3月27日

#1179 in 进程宏

Apache-2.0

8KB
63

simple-bind: Rust中的一行非穷举绑定

Build Status

仅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.rsmain.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