如何用postgres-rs将PostgreSQL smallint简洁转为Rust的i64?
解决方案
你可以用Option的map方法实现一行转换,这是最简洁且符合Rust风格的写法:
let value: Option<i64> = row.get(index).map(i64::from);
为什么这个写法可行?
row.get(index)返回对应PostgreSQLsmallint类型的Option<i16>Option::map会自动处理两种情况:- 若为
Some(v),就把v传入i64::from做类型转换,返回Some(i64::from(v)) - 若为
None,直接返回None,完全替代你原来的if let逻辑
- 若为
你的错误写法问题分析
第一种写法的语法和逻辑都有问题:
let value: Option<i64> = row.get::<Option<i16>>::get(index);类型标注位置错误,正确标注应该是
row.get::<_, Option<i16>>(index),但就算修正,还是需要把Option<i16>转成Option<i64>,属于多此一举。报错是因为编译器被错误的语法误导,误解了参数类型。第二种写法的问题在于:Rust标准库没有为
Option<T>到Option<U>实现Fromtrait——哪怕T到U有From实现。这种嵌套类型的转换必须用map处理,不能直接用into()。
其他可选写法
如果需要更明确的类型标注(避免编译器推断歧义),也可以写成:
let value = row.get::<_, Option<i16>>(index).map(|v| v as i64);
这里用as转换和i64::from效果完全一致,因为i16转i64是无损的。
内容的提问来源于stack exchange,提问作者Code4R7
相关产品推荐
相关产品推荐

