迭代 Rust 中的结构向量

Posted

技术标签:

【中文标题】迭代 Rust 中的结构向量【英文标题】:Iterate over vector of structs in Rust 【发布时间】:2021-11-24 00:33:42 【问题描述】:

我正在尝试调试我的设备在 Rust 中无法在我的 MacOS BigSur 笔记本电脑上被识别的原因。我已经运行了我的 Python 代码来验证它是否存在,尽管它无法被读取,这很奇怪。由于 Rust 有串口库,而且它似乎比 PyUSB 强大得多,所以我决定使用它。

我使用的代码取自一个在 x86_64 处理器上运行的预先存在的项目,Big Sur 使用 Apples M1 芯片。

代码如下:

#[cfg(not(feature = "fake_serial"))]
pub fn start_serial_probe(
    custom_tty: &Option<String>,
// ) -> Result<crossbeam_channel::Receiver<B0xxMessage>, ViewerError> 
) 
    let b0xx_port = serialport::available_ports();
    for port in &b0xx_port 
        // let port : serialport::SerialPortInfo = port;
        println!(" ", port.port_name);
    
    ...

编译时的错误与我在 VSCode 中收到的错误相同。

&amp;std::vec::Vec&lt;serialport::SerialPortInfo&gt; 类型上没有字段 port_name

我不完全确定如何通过向量抓取项目,因为大多数使用整数等某种类型的数组。

谢谢!

【问题讨论】:

【参考方案1】:

函数serialport::available_ports() 返回Result&lt;Vec&lt;SerialialPortInfo&gt;&gt;,而不是Vec&lt;SerialPortInfo&gt;

这里的混淆可能是因为Result 实现了IntoIterator,并且循环它会产生一个或零个元素,具体取决于它分别是Ok 还是Err。在这种情况下,该项目是 Vec,这就是您无法访问 SerialialPortInfo 字段的原因。

这应该可行:

if let Ok(b0xx_port) = serialport::available_ports() 
    for port in &b0xx_port 
        println!(" ", port.port_name);
    
 else 
    // handle the error

【讨论】:

太棒了,以后我得注意扩展结果了。

以上是关于迭代 Rust 中的结构向量的主要内容,如果未能解决你的问题,请参考以下文章

从Rust中的迭代器填充切片的最佳方法是什么? [重复]

如何在 Rust 中修复“.. 在循环的上一次迭代中可变地借用”?

Rust中的迭代器的使用:map转换filter过滤fold聚合chain链接

Rust中的迭代器

从 rust 中的通道迭代器获取第一个接收到的值

迭代器在添加到添加到列表向量的结构中时会停止指向某个值吗?