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
相关产品推荐
相关产品推荐

