如何从数组值创建实例

时间:2019-09-02 21:29:18

标签: rust

我刚接触生锈,并曾经用其他语言(如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");

但是我总是在所有权规则上挣扎。 您将如何操作或最佳做法是什么?

1 个答案:

答案 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");