0

我一直在关注使用自定义类型的 Rust 教程。因此定义了一个库,稍后通过 cargo.toml 依赖项在 rust 二进制文件中使用该库。我最终遇到了几个问题:

生锈:

  1. 需要在二进制文件中使用的 cargo.toml 依赖项( main.rs )引用的库代码(下面的 money_typesafe)定义提供这些功能的特征。
  2. 允许在 using 二进制文件中应用特征。
  3. 允许 1) & 2)?

如果 2, 是允许的,定义 Trait 的语法是否以任何方式改变?

货物.toml

...
[dependencies]
money_typesafe = {path = "../../../2-Traits/10-Day-2-Assignment/day2assign/"}`

main.rs

...
use money_typesafe::currencies::{Money,GBP};

即对于 2) 我可以在 main.rs 中向 Money 或 GBP 添加特征吗?

脚注:

我确实在 github 上找到了教程的代码。它遵循选项 1 的情况。不确定其他选项是否存在在其他地方扩展类型的能力。

它涉及:

  • 添加分配
  • 否定(我认为这里给出的示例没有帮助。不使用数字类型做某事并使用枚举只会使水域变得混乱)。
use std::ops::AddAssign;
use std::ops::Neg;
4

1 回答 1

2

您在问题中使用的术语有点模棱两可 - 我不确定您所说的“应用”特征是什么意思。特征出现的主要方式有以下三种:

  1. 可以定义特征(您可以在其中指定它具有的方法及其相关类型)。

  2. 可以实现特征(在某些类型上实现特征的方法)

  3. 可以使用特征(将其带入范围并调用其方法)。

在哪里可以实现 trait 有一些限制。这些限制被称为“孤儿规则”,您可以在本页中找到它的描述。

该规则规定,除非该 trait 在您的 crate 中定义,和/或您正在实现它的类型在您的 crate 中定义,否则您不能在类型上实现 trait。

例如,您可以自由定义自己的特征,然后在外来类型(例如 std 库中的那些或您正在导入的其他 crate 中的那些)上实现它们。你也可以自由地在你自己的类型上实现外来特征。两者都是常见的模式。

孤儿规则有一个解决方法:“新类型模式”。你可以在这个问题中找到相关信息。

因此,要回答您的具体问题:

rust 是否需要在二进制文件中使用的 cargo.toml 依赖项(main.rs)引用的库代码(下面的money_typesafe)中定义提供这些功能的特性。

不可以。特征可以在二进制包中定义。

rust 是否允许在 using 二进制文件中应用Traits。

是的,只要在二进制 crate 中定义了 trait 或实现它的类型,或两者都定义。

允许 1) & 2)?

是的,可以在外部或内部二进制 crate 中定义和实现特征,受孤儿规则的约束。

如果 2, 是允许的,定义 Trait 的语法是否以任何方式改变?

不,不是的。需要注意的一点是,一个 trait 必须在范围内才能调用它的方法,因此有必要use使用当前范围内未定义的 trait。

于 2020-08-08T23:42:19.633 回答