我对 rust 还很陌生,并且习惯用 JavaScript 等其他语言编写代码。我的项目是编写一个程序,通过 Rust 中的 rppal crate 从我的树莓派控制 cc2500 芯片。到目前为止它有效,但我正在寻找正确的方法。
给定:我有一个无符号 8 位整数列表,需要 Segments 列表延迟 20。
在 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);
在使用rust 中我尝试过这样
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");
但我总是与所有权规则作斗争。 您将如何执行此操作或最佳实践是什么?
最佳答案
由于您的所有切片恰好都是一元的,因此您可以使用 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");
关于rust - 如何从数组值创建实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57762843/