2 个版本
0.0.1 | 2024年6月20日 |
---|---|
0.0.0 | 2024年5月2日 |
#30 in #arrays
41KB
716 行
图状3D数组的特性。(正在进行中。)
工作原理
Blok 可以用来构建“块”数组。它还可以通过使用“连接”来定义不同块之间的关系,从而以过程化方式链接它们的属性。
- 将
blok
添加到您的项目中
$ cargo add blok
use blok::{ Block, Stack, Layout, layout, Alignment, connect::* };
- 定义一个
Block
类型。这是矩阵的元素/粒子。
/// Simple implementation of a Block type.
#[derive(Clone)]
struct MyBlock {
/// Data for block.
data: String,
/// Store "connections" as a collection of data from other blocks.
connections: Vec<String>
} impl MyBlock {
/// How u maek blok.
fn new(data: &String) -> Self {
MyBlock { data: data.to_owned(), connections: Vec::new() }
}
}
impl Block for MyBlock {
/// Encapsulate any arguments for the constructor into a single type.
type ConstructionInstructions = String;
/// Boilerplate, sorry.
type Constructor = fn(&String) -> Self;
/// Encapsulate any arguments for the connector into a single type.
type ConnectionInstructions = ();
/// Define the constructor for a non-data "void" block (placeholders & spacers).
fn void() -> Self {
MyBlock {
data: String::new(),
connections: Vec::new()
}
}
/// Define the test to check for "void" blocks (placeholders & spacers).
fn is_void(&self) -> bool {
match self.data.as_str() {
"" => true,
_ => false
}
}
/// Define the block-to-block connection procedure.
fn connect(&mut self, other: &mut Self, _instr: &()) {
self.connections.push(other.data.clone())
}
}
- 定义一个
Stack
类型(块的三维数组)。
/// Stack type represents a matrix of Blocks.
#[derive(Clone)]
struct MyStack {
/// Stores the shape of the matrix as vectors of layer row lengths.
layouts: Vec<Layout>,
/// Stores the actual blocks together in memory.
blocks: Vec<MyBlock>
}
impl Stack<MyBlock> for MyStack {
/// Define the default constructor within the Stack implementation.
fn new() -> Self {
MyStack { layouts: vec![], blocks: vec![] }
}
// Boilerplate. "Derive" macro TBD.
fn layouts(&self) -> &Vec<Layout> { &self.layouts }
fn layouts_mut(&mut self) -> &mut Vec<Layout> { &mut self.layouts }
fn blocks(&self) -> &Vec<MyBlock> { &self.blocks }
fn blocks_mut(&mut self) -> &mut Vec<MyBlock> { &mut self.blocks }
}
- 从块的层中构建 Stack。
fn main() {
let mut pyramid = MyStack::new();
let mut bottom = Layer::new();
bottom.populate_with_clones(layout![3; 3], &MyBlock::new(&"bottom".to_string()));
pyramid.stack(bottom);
let mut middle = Layer::new();
middle.populate_with_clones(layout![2; 2], &MyBlock::new(&"middle".to_string()));
pyramid.stack(middle);
let mut top = Layer::new();
top.add_block(MyBlock::new(&"top".to_string()));
pyramid.stack(top);
...
- 连接 Stack 使其块彼此了解。
...
connect::autoconnect_stack_uniformly(&mut pyramid, Alignment::dense, vec![(); 10]);
// Do something with the connected pyramid.
}
未来方向
我正在开发这个包以支持我正在工作的另一个项目,并决定将其拆分出来,因为它可能更通用,也可能在其他地方很有用。
当前任务可在 TODO.md 中跟踪。
依赖关系
~0.8–1.5MB
~31K SLoC