我尝试使用以下代码对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文档,但我想我错过了一些非常基本的东西,你知道那可能是什么吗?
2条答案
按热度按时间92vpleto1#
我不知道从这里去哪里,我已经反复阅读了相关的cpal和rust文档,但我想我错过了一些非常基本的东西,你知道那可能是什么吗?
HostTrait::Devices
显然可能失败,因此它返回结果和选项一样是可迭代的,当被迭代时,它们表现为0(Err)或1(Ok)项的序列。这就是
into_iter()
调用的内容,它迭代结果,而不是结果中的设备。2nc8po8w2#
解决方案:
正如@Masklinn所指出的,default_host.devices()实际上返回的是
Result
对象,而不是Devices
对象,我使用模式匹配处理Result
,并让匹配的每个分支调用不同的函数,一个在出错的情况下发出警报,另一个在成功返回的情况下继续执行逻辑流:将来我会写一个更健壮的版本,在枚举主机设备失败时不会死机,但现在这还不错。@Chayim Friedman还正确地注意到for循环会自动对对象调用
.to_iter()
,所以我从print_devices函数中删除了显式的.to_iter()
。