Rust函数返回std::time::Instant报错,为何需改用u128?
Rust函数返回耗时的类型匹配问题
我想编写一个返回耗时的Rust函数,最初的函数定义如下:
fn insert_test(Table: &mut HashMap<String,String>, items: &Vec<String>) -> std::time::Instant {
但编译器报错:
^^^^^^^^ expected struct `Instant`, found `u128`
编译器提示需改用u128作为返回类型,但我疑惑的是,std::time::Instant的官方文档并未明确说明它是u128类型,请问如何提前知晓这一点?修改后的函数代码如下:
// 向传入的数据结构插入元素并返回耗时 fn insert_test(Table: &mut HashMap<String,String>, items: &Vec<String>) -> u128 { let t0 = Instant::now(); for i in items { Table.insert(i.to_string(), "blahblah".to_string()); } let duration = t0.elapsed().as_millis(); duration }
问题解析与提前知晓类型的方法
你混淆了Instant和Duration的类型关系:
Instant::now()获取的是时间点,类型确实是std::time::Instant;但你函数里实际返回的是t0.elapsed()得到的时间间隔(类型为std::time::Duration),再通过as_millis()转换后的毫秒数——而Duration::as_millis()的返回类型就是u128,你之前看的是Instant的文档,找错了对应方法的说明。
要提前知晓这类类型信息,有几个实用方法:
- 找对文档位置:查看
Duration的官方文档,里面会明确标注as_millis()、as_secs()等方法的返回类型。 - 利用编辑器提示:在VS Code、IntelliJ等支持Rust的编辑器中,把鼠标悬停在
as_millis()调用或者duration变量上,会直接显示对应的类型信息。 - 编译器错误提示直接推导:报错信息已经明确告诉你“预期Instant,实际得到u128”,这就是最直接的类型提示。
另外,补充一个更灵活的写法:你可以直接返回Duration类型,让调用方自行决定转换为毫秒、秒还是其他单位,同时遵循Rust的命名规范调整变量名和参数类型:
use std::collections::HashMap; use std::time::{Instant, Duration}; fn insert_test(table: &mut HashMap<String, String>, items: &[String]) -> Duration { let t0 = Instant::now(); for i in items { table.insert(i.to_string(), "blahblah".to_string()); } t0.elapsed() }
内容的提问来源于stack exchange,提问作者user2066671
相关产品推荐
相关产品推荐

