1个不稳定版本
0.1.0 | 2023年11月4日 |
---|
#5 在 #解构
在 obstruct 中使用
20KB
291 行
关于
obstruct
是Rust的匿名结构体和命名参数的一个实验性实现。
匿名结构体
使用 instruct!
创建匿名结构体,并使用 destruct!
解构它
#![feature(associated_const_equality)]
use obstruct::{instruct, destruct};
// Create an anonymous struct.
let structured = instruct! { red: 0, green: 1.0, blue: 2 };
// Destructure that struct.
destruct! { let {red, green, blue} = structured };
assert_eq!(red, 0);
assert_eq!(green, 1.0);
assert_eq!(blue, 2);
注意,这不仅仅是一个元组:字段指定的顺序并不重要!
#![feature(associated_const_equality)]
use obstruct::{instruct, destruct};
// Create an anonymous struct.
let structured = instruct! { red: 0, green: 1.0, blue: 2 };
// Destructure that struct.
destruct! { let {blue, green, red} = structured };
assert_eq!(red, 0);
assert_eq!(green, 1.0);
assert_eq!(blue, 2);
如果你尝试访问一个不存在的字段,你将得到一个编译时错误
#![feature(associated_const_equality)]
use obstruct::{instruct, destruct};
// Create an anonymous struct.
let structured = instruct! { red: 0, green: 1.0, blue: 2 };
// Destructure that struct.
destruct! { let {blue, green, oops} = structured };
// ^^^ --- will fail with a complex error message pointing at `oops`.
命名参数
使用 destruct!
创建接受命名参数的函数,并使用 call!
调用它
#![feature(associated_const_equality)]
use obstruct::{call, instruct, destruct};
// Create a function accepting anonymous arguments.
destruct!(fn do_something({red: u8, green: &'static str, blue: ()}) {
println!("Roses are {red}");
});
// Call this function
call!(do_something, {red: 0, green: "GREEN", blue: ()});
// Or equivalently
do_something(instruct! {red: 0, green: "GREEN", blue: ()});
再次强调,参数指定的顺序并不重要
#![feature(associated_const_equality)]
use obstruct::{call, instruct, destruct};
// Create a function accepting anonymous arguments.
destruct!(fn do_something({red: u8, green: &'static str, blue: ()}) {
println!("Roses are {red}");
});
do_something(instruct! {blue: (), green: "GREEN", red: 0});
再次强调,错误在编译时会被捕获
#![feature(associated_const_equality)]
use obstruct::{call, instruct, destruct};
// Create a function accepting anonymous arguments.
destruct!(fn do_something({red: u8, green: &'static str, blue: ()}) {
println!("Roses are {red}");
});
do_something(instruct! {blue: (), green: "GREEN", oops: 0});
// ^^^ --- will fail with a complex error message pointing at `oops`.
call!(do_something, {red: 0, green: "GREEN", oops: ()});
// ^^^ --- will fail with a complex error message pointing at `oops`.
依赖关系
~0.7–1.2MB
~26K SLoC