You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用postgres-rs将PostgreSQL smallint简洁转为Rust的i64?

解决方案

你可以用Option的map方法实现一行转换,这是最简洁且符合Rust风格的写法:

let value: Option<i64> = row.get(index).map(i64::from);

为什么这个写法可行?

  • row.get(index)返回对应PostgreSQL smallint类型的Option<i16>
  • Option::map会自动处理两种情况:
    • 若为Some(v),就把v传入i64::from做类型转换,返回Some(i64::from(v))
    • 若为None,直接返回None,完全替代你原来的if let逻辑

你的错误写法问题分析

  1. 第一种写法的语法和逻辑都有问题:

    let value: Option<i64> = row.get::<Option<i16>>::get(index);
    

    类型标注位置错误,正确标注应该是row.get::<_, Option<i16>>(index),但就算修正,还是需要把Option<i16>转成Option<i64>,属于多此一举。报错是因为编译器被错误的语法误导,误解了参数类型。

  2. 第二种写法的问题在于:Rust标准库没有为Option<T>到Option<U>实现From trait——哪怕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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 23:48:15