Cargo Clippy 抛出错误“问号运算符在这里没用” - 建议可以实施吗?

问题描述

我已经接管了一个部署过程,其中一部分运行 Cargo Clippy,直到上周晚些时候,当我开始收到此错误时,它一直运行良好:

错误:问号运算符在这里没用

我已阅读建议的链接 https://rust-lang.github.io/rust-clippy/master/index.html#needless_question_mark 并理解?不再需要,并查看了它提供的建议更改。我只是想知道我是否可以按照建议进行更改,因为有些似乎删除了一些代码,所以我不确定结果是否相同。

一些建议的更改似乎很简单,也可以: 从这里

 Ok(dsl::orgs
     .filter(dsl::salesforce_id.eq(salesforce_id))
     .get_result(conn)?)

为此:

dsl::orgs
     .filter(dsl::salesforce_id.eq(salesforce_id))
     .get_result(conn)

所以我猜测上述类型的更改可以安全接受吗?

然后我有这些

  1. 此处“可选”已在建议的修复中消失。来自:

    Ok(dsl::orgs
        .filter(
            dsl::customer_id
                .eq(new_org.customer_id)
                .and(dsl::name.eq(&new_org.name)),)
        .get_result(conn)
        .optional()?)
    

    dsl::orgs
        .filter(
            dsl::customer_id
                .eq(new_org.customer_id)
                .and(dsl::name.eq(&new_org.name)),)
    
  2. 还有这个,在建议的修复中内连接消失了:

    Ok(orgs::dsl::orgs
     .filter(orgs::dsl::customer_id.eq(customer_id))
     .filter(orgs::dsl::kind.eq(org_kind))
     .filter(
         orgs::dsl::kind
             .eq(OrgKind::Production)
             .or(orgs::dsl::name.eq(&org_name)),)
     .inner_join(schema::customers::dsl::customers)
     .get_result(conn)?)
    

    为此:

    orgs::dsl::orgs
        .filter(orgs::dsl::customer_id.eq(customer_id))
        .filter(orgs::dsl::kind.eq(org_kind))
        .filter(
            orgs::dsl::kind
                .eq(OrgKind::Production)
    

这 2 个建议的修复可以实施吗?有人可以提供一些帮助吗?

解决方法

我已经接管了一个部署过程,其中一部分运行 Cargo Clippy,直到上周晚些时候它都运行良好,

lint 上周出现是因为 Rust 1.51 和 new accompanying Clippy version 于上周四发布,并添加了 needless_question_mark

当我开始收到此错误时:

您的 CI 可能不应该将所有 Clippy lint 都视为错误。 Clippy 旨在针对许多简单的代码样式改进或可能问题发出警告;将它们视为错误会导致将来不必要的损坏。

所以我猜测上述类型的更改可以安全接受吗?

Ok(some_expression?) 几乎some_expression相同。唯一的区别是带有 ? 的版本可能会将表达式的错误类型(E 中的 Result<T,E>)隐式转换为函数预期的错误类型。如果错误类型相同,不需要转换,那么可以去掉Ok?,得到相同的结果;如果错误类型不同,则简化版本将无法编译。

此处“可选”已在建议的修复中消失。

这似乎是 Clippy 或任何应用此修复程序的工具中的错误,因为生成的代码在语义上是不同的,甚至无法编译。在这种情况下,我会手动删除 Ok?,并报告错误。