#traits #init #array #vec #2d #array-vec

nightly no-std init_trait

一个用于简化“可索引”数据结构初始化的小助手特质

2个不稳定版本

0.2.0 2020年8月21日
0.1.0 2020年7月28日

#15 in #array-vec

MIT许可证

9KB
97

init_trait

文档

仓库

变更日志

一个用于简化“可索引”数据结构初始化的小助手特质。

use init_trait::Init;

struct House { number: usize }

// [T; N]: Init<T, usize>
let road = <[House; 3]>::init(|i| House { number: i + 1 });

assert_eq!(road[0].number, 1);
assert_eq!(road[1].number, 2);
assert_eq!(road[2].number, 3);

要使用它,将其添加到您的Cargo.toml中的依赖项

[dependencies]
init_trait = "0.2.0"

lib.rs:

一个助手特质,通过应用于每个“索引”的函数来初始化数据结构。

此特质旨在简化将“可索引”数据结构初始化为非默认值的操作。例如,如果您想初始化一个长或任意长度的数组,您需要首先将其初始化为某些默认值,然后修改每个元素为所需的值

// struct needs to implement either Copy or Default to initialise the array
#[derive(Copy, Clone)]
struct House { number: usize }

// Need to first initialise road to some dummy value to avoid the error:
//     road[i] = House { number: i };
//     ^^^^^^^ use of possibly-uninitialized `road`
let mut road = [House { number: 0 }; 3];

for i in 0..3 {
    road[i] = House { number: i + 1 };
}

assert_eq!(road[0].number, 1);
assert_eq!(road[1].number, 2);
assert_eq!(road[2].number, 3);

对于泛型类型或无默认值的类型,这可能会很困难。

使用Init,您可以为生成元素提供给定索引的函数

use init_trait::Init;

struct House { number: usize }

// [T; N]: Init<T, usize>
let road = <[House; 3]>::init(|i| House { number: i + 1 });

assert_eq!(road[0].number, 1);
assert_eq!(road[1].number, 2);
assert_eq!(road[2].number, 3);

无运行时依赖