Rust 是否有相当于 C++ 的运算符 bool() 来将结构转换为布尔值?

Rah*_*ahn 8 rust

在 C++ 中,我们可以重载operator bool()将结构转换为bool

struct Example {
    explicit operator bool() const {
        return false;
    }
};

int main() {
    Example a;
    if (a) { /* some work  */ }
}
Run Code Online (Sandbox Code Playgroud)

我们可以用 Rust 做一些简单(而且优雅)的事情吗:

pub struct Example {}

fn main() {
    let k = Example {};
    if k {
        // some work
    }
}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 11

没有直接等价的operator bool()。一个接近的替代方案是实现From(也将实现Into)并显式调用转换:

pub struct Example;

impl From<Example> for bool {
    fn from(_other: Example) -> bool {
        false
    }
}

fn main() {
    let k = Example;
    if k.into() {
        // some work
    }
}
Run Code Online (Sandbox Code Playgroud)

这将取得 的所有权,这意味着您在转换后Example无法使用它。k您可以实现它作为参考 ( impl From<&Example> for bool),但调用站点会变得更丑陋 ( (&k).into())。

在这种情况下我可能会避免使用From/ Into。相反,我会在该类型上创建一个谓词方法。这将更具可读性并且可以采用&self,允许您继续使用该值。

也可以看看:

  • 这不仅仅是为了一致性。实现“From&lt;T&gt; for U”可以免费为您提供“Into&lt;U&gt; for T”,因为有全面的实现,而直接实现“Into&lt;U&gt; for T”则不会为您提供“From”实现。 (4认同)
  • [API 指南](https://rust-lang.github.io/api-guidelines/interoperability.html#conversions-use-the-standard-traits-from-asref-asmut-c-conv-traits) 指出永远不应该实现“Into”。由于这是一个投票率相当高的答案,因此它可能应该使用惯用的“From &lt;Example&gt; for bool”来实现? (3认同)