rust 为什么遍历Devices对象不返回Device对象?

pdkcd3nj  于 2023-03-18  发布在  其他
关注(0)|答案(2)|浏览(122)

我尝试使用以下代码对Rust的cpal crate枚举系统的默认主机音频设备:

use cpal::traits::{HostTrait, DeviceTrait};
use cpal::{Device, Host};

fn main(){
    let default_host:Host = cpal::default_host();
    for device in default_host.devices().into_iter(){
        println!("> {}", device.name())
    }
}

当我运行代码时,很明显我正在迭代的对象不是Device对象,而是Devices对象,返回以下错误:

error[E0599]: no method named `name` found for struct `Devices` in the current scope

   |
16 |         println!("> {}", device.name())
   |                                 ^^^^ method not found in `Devices`

我不知道从这里去哪里,我已经反复阅读了相关的cpal和rust文档,但我想我错过了一些非常基本的东西,你知道那可能是什么吗?

92vpleto

92vpleto1#

我不知道从这里去哪里,我已经反复阅读了相关的cpal和rust文档,但我想我错过了一些非常基本的东西,你知道那可能是什么吗?
HostTrait::Devices显然可能失败,因此它返回

Result<Self::Devices, DevicesError>

结果和选项一样是可迭代的,当被迭代时,它们表现为0(Err)或1(Ok)项的序列。这就是into_iter()调用的内容,它迭代结果,而不是结果中的设备。

2nc8po8w

2nc8po8w2#

解决方案:

正如@Masklinn所指出的,default_host.devices()实际上返回的是Result对象,而不是Devices对象,我使用模式匹配处理Result,并让匹配的每个分支调用不同的函数,一个在出错的情况下发出警报,另一个在成功返回的情况下继续执行逻辑流:

use cpal::traits::{HostTrait, DeviceTrait};
use cpal::{Device, Host};

fn main() {
    let default_host:Host = cpal::default_host();
    match default_host.devices() {
        Ok(devices) => print_devices(devices),
        Err(_error) => panic!("Error retrieving devices"),
    }; }

fn print_devices(default_host_devices: cpal::Devices) {
    for device in default_host_devices {
        println!("> {}", device.name().unwrap())
    } }

将来我会写一个更健壮的版本,在枚举主机设备失败时不会死机,但现在这还不错。@Chayim Friedman还正确地注意到for循环会自动对对象调用.to_iter(),所以我从print_devices函数中删除了显式的.to_iter()

相关问题