我刚接触生锈,并曾经用其他语言(如JavaScript)编写代码。我的项目是编写一个程序,以通过Rust中的rppal板条箱从树莓派控制cc2500芯片。到目前为止,它仍然有效,但是我正在寻找正确的方法。
给出:我有一个无符号的8位整数列表,并且需要一个延迟为20的Segments列表。
在JavaScript中,我会这样
let bytes = [0x7F, 0x55, ...]
let segments = bytes.map(byte => {
let segment = Segment.with_write([byte]);
segment.set_delay(20);
return segment;
});
this.spi.transfer_segments(segments);
生锈,我这样尝试过
let bytes = vec![0x7F, 0x55, ...];
let mut segments:Vec<Segment> = vec![];
for (i, byte) in bytes.iter().enumerate() {
let buffer = [byte.clone()];
segments[i] = Segment::with_write(&buffer);
segments[i].set_delay(20);
}
let written = self.spi.transfer_segments(&segments)
.expect("Could not write to SPI bus");
但是我总是在所有权规则上挣扎。 您将如何操作或最佳做法是什么?
答案 0 :(得分:4)
由于所有切片都恰好是一元的,因此可以使用std::slice::from_ref
来创建它们,指向bytes
向量中的字节:
let bytes = vec![0x7F, 0x55, ...];
let segments = bytes.iter().map(|byte| {
let buffer = std::slice::from_ref(byte);
let mut segment = Segment::with_write(buffer);
segment.set_delay(20);
segment
});
let segments: Vec<_> = segments.collect().
let written = self.spi.transfer_segments(&segments)
.expect("Could not write to SPI bus");