【问题标题】:How to I implement a trait on a builtin in Rust?如何在 Rust 的内置函数上实现特征?
【发布时间】:2022-12-11 20:19:08
【问题描述】:

在铁锈中:

let int: i32 = 3;
let float: f32 = 3.3;
let res = int*float; // Invalid
let res = (int as f32)*float; // Valid

为了使这更容易,我希望在 * 运算符上实现覆盖,鉴于 Rust 的错误消息,这似乎是可能的:

cannot multiply `{integer}` by `{float}`
the trait `Mul<{float}>` is not implemented for `{integer}`
the following other types implement trait `Mul<Rhs>`:

但是写 impl Mul&lt;i32&gt; for f32 显然也是不可能的:

only traits defined in the current crate can be implemented for primitive types
define and implement a trait or new type instead

那么应该怎么做呢?是否有板条箱已经实施了这些?

【问题讨论】:

  • 编译器根本不允许这样做。
  • 您不能为您不拥有的类型实现您不拥有的特征。

标签: rust


【解决方案1】:

您不能为原语实现 Mul。这是 rusts 外来类型规则的一部分:对于你的 crate 中的一个实现,至少一个已实现的类型或特征必须已经在你的 crate 中定义。由于 Mul 和原语都没有在您的代码中定义,因此您无法为它们创建实现。

如果你真的想这样做,你需要围绕 f32 创建一个包装器类型,并在其上实现 Mul 和所有其他相关运算符。

【讨论】:

    【解决方案2】:

    特征告诉 Rust 编译器特定类型具有的功能以及可以与其他类型共享的功能。特征是不同类型之间共享行为的抽象定义。所以,我们可以说 traits 之于 Rust 就像接口之于 Java 或抽象类之于 C++。特征方法能够访问该特征内的其他方法。

    特征定义 特征是通过提供特征名称后跟关键字“特征”来定义的。在定义任何我们必须实施以在实施上进行培训的情况下。

    【讨论】:

      猜你喜欢
      • 2016-05-29
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 2020-08-15
      • 2021-08-20
      • 2022-08-15
      • 1970-01-01
      相关资源
      最近更新 更多