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

Rust Polars中lit字面量超i32范围,如何指定为i64类型?

解决Polars中lit字面量超出i32范围的问题

问题原因

你遇到的「literal out of range for i32」错误,本质是Rust默认会把无后缀的整数字面量推断为i32类型,而1099511627776(1TiB)远大于i32的最大值(2^31-1=2147483647),编译阶段就会触发范围溢出错误。你尝试的i64::from(1099511627776)无效,是因为字面量本身在编译时就被判定为i32溢出,根本无法执行转换。

解决方法

直接给整数字面量添加i64类型后缀,让Rust在编译时就将其识别为i64类型,具体有两种写法:

1. 给字面量加i64后缀(最简洁)

use polars::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut df = df! {
        "bytes" => [1099511627776i64, 2199023255552i64, 549755813888i64]
    }?;

    // 直接给除数字面量加i64后缀
    df = df.with_columns([
        (col("bytes") / lit(1099511627776i64)).alias("tib")
    ])?;

    println!("{}", df);
    Ok(())
}

2. 显式使用Literal::new指定类型

如果需要更明确的类型声明,可以用Literal::new直接构造i64类型的字面量:

use polars::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut df = df! {
        "bytes" => [1099511627776i64, 2199023255552i64, 549755813888i64]
    }?;

    let tib_divisor = Literal::new(1099511627776i64);
    df = df.with_columns([
        (col("bytes") / tib_divisor).alias("tib")
    ])?;

    println!("{}", df);
    Ok(())
}

额外注意

如果你的bytes列本身是i32类型,还需要先将其转换为i64避免运算时溢出,可使用col("bytes").cast(DataType::Int64)。

内容的提问来源于stack exchange,提问作者vv-io

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:58:27