生锈的特征。是习惯在依赖库中定义它们,还是可以在使用它们的二进制代码中为类型添加Traits?

Rust traits. Is it customary to define them in the dependency library, or can you add Traits to the type in the binary code that uses them?

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

是否生锈:

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

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

cargo.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;

你在问题中使用的术语有点含糊——我不确定你所说的“应用”特征是什么意思。特质出现的方式主要有以下三种:

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

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

  3. 可以使用 trait(将其引入作用域并调用其方法)。

对于可以在何处实现特征存在一些限制。这些限制被称为“孤立规则”,您将在 this page.

中找到相关描述

该规则规定你不能在类型上实现特征,除非特征在你的包中定义,and/or你正在实现它的类型在你的包中定义。

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

孤立规则有一个解决方法:“新类型模式”。您可以在 this question.

中找到相关信息

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

Does rust necessitate Traits that provide these capability to be defined back in library code (money_typesafe below) referenced by the cargo.toml dependency (of main.rs) that gets used in the binary.

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

Does rust allow Traits to be applied implemented in the using binary.

是的,只要在二进制包中定义特征或实现它的类型,或两者都定义。

allow both 1) & 2)?

是的,traits 可以在二进制 crate 的外部或内部定义和实现,但要遵守孤儿规则。

If 2, is permitted, does the syntax change on defining the Trait in any way?

不,它没有。不过要注意的一件事是,特征必须在范围内才能调用其方法,因此有必要 use 当前范围内未定义的特征。