在Rust版Polars中能否使用PartialOrd与PartialEq重载的比较运算符?
Rust版Polars中比较运算符重载的问题
Polars手册《运算符》章节内容:
在Rust和Python中可直接使用运算符(如+-*/<>),因为这两种语言支持运算符重载。例如,+会转换为.add()方法,可任选其一使用。
我在Rust版Polars中成功使用了+、-、/、*这些重载运算符,运行完全正常,但没法用PartialOrd和PartialEq对应的比较运算符>、<、!=、==。这是Polars文档有误,还是我用>=、<=这类比较运算符的写法错了?
代码示例
let df_numerical = df .clone() .lazy() .select([ (col("nrs") + lit(5)).alias("nrs + 5"), // 正常运行 (col("nrs") > lit(5)).alias("nrs > 5"), // 此处触发编译器错误 (col("nrs") - lit(5)).alias("nrs - 5"), // 正常运行 (col("nrs") * col("random")).alias("nrs * random"), // 正常运行 (col("nrs") / col("random")).alias("nrs / random"), // 正常运行 ]) .collect()?;
编译器错误信息
error[E0369]: binary operation `>` cannot be applied to type `polars::prelude::Expr` --> src/main.rs:257:25 | 257 | (col("nrs") > lit(5)).alias("nrs > 5"), | ---------- ^ ------ polars::prelude::Expr | | | polars::prelude::Expr
问题解答
这不是你的写法错误,而是Polars文档的描述存在疏漏——Rust版Polars并未为Expr类型实现比较运算符(>、<、==等)的重载,必须使用对应的方法调用:
>对应.gt()<对应.lt()>=对应.gte()<=对应.lte()==对应.eq()!=对应.neq()
修改后的可运行代码:
let df_numerical = df .clone() .lazy() .select([ (col("nrs") + lit(5)).alias("nrs + 5"), col("nrs").gt(lit(5)).alias("nrs > 5"), // 使用gt方法替代>运算符 (col("nrs") - lit(5)).alias("nrs - 5"), (col("nrs") * col("random")).alias("nrs * random"), (col("nrs") / col("random")).alias("nrs / random"), ]) .collect()?;
目前Polars的Rust实现中,仅为Expr实现了算术运算符(+、-、*、/等)的重载,比较逻辑只能通过显式调用方法完成,文档里关于Rust支持所有运算符重载的描述并不准确。
内容的提问来源于stack exchange,提问作者Yuri_Budilov
相关产品推荐
相关产品推荐

