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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 01:40:59