Rust中如何从Result<Box<dyn Any>>提取f32并完成断言?
正确提取f32并完成断言的方法
你之前的方向没错,但Box<dyn Any>的downcast操作细节没处理到位,直接解引用后调用downcast是行不通的,得用Box<dyn Any>自带的downcast方法。下面是修正后的测试代码及关键步骤说明:
修正后的测试函数
#[tokio::test] async fn call() { let mut client = ExchangeCurrencyRequestsMock { base: "USD".to_string(), to: "AUD".to_string(), amount: 100.0, }; let result = client.call().await; // 1. 先处理Result,确保请求成功,拿到Box<dyn Any> let any_box = result.expect("请求调用失败"); // 2. 将Box<dyn Any>向下转型为Box<f32>,解引用后得到f32值 let calculated_value = *any_box.downcast::<f32>().expect("类型转换失败,返回值不是f32"); // 3. 断言时注意用f32类型字面量,避免类型不匹配 assert_eq!(calculated_value, 152.0f32); }
关键细节说明
downcast::<f32>()是Box<dyn Any>的专属方法,它会尝试把动态类型的Box转换成具体的Box<f32>,成功返回Ok(Box<f32>),失败则返回Err(Box<dyn Any>)。- 你原测试代码里直接写
assert_eq!(result, 152.0)是错误的——result是Result类型,152.0是f64,类型完全不匹配,必须先提取出内部的f32值再做断言。 - 如果不想用
expect(担心panic),可以用match处理所有分支,更严谨:
match result { Ok(any_box) => { match any_box.downcast::<f32>() { Ok(value_box) => assert_eq!(*value_box, 152.0f32), Err(_) => panic!("返回值不是f32类型"), } } Err(e) => panic!("请求调用失败: {}", e), }
另外提两个你代码里的小问题:
- 模拟的JSON数据格式错误,外层应该用
{}而非[](是对象不是数组); - PLN对象里的
"PLN": "1.0"后面少了逗号,会导致serde_json解析失败。
内容的提问来源于stack exchange,提问作者Shibbaz
相关产品推荐
相关产品推荐

