rust - rust 特征。在依赖库中定义它们是习惯的做法,还是可以在使用它们的二进制代码中将Traits添加到类型中?

标签 rust dependencies traits toml

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

  • E0368: A binary assignment operator like += or ^= was applied to a type that doesn't support it.
  • E0600: cannot apply unary operator '-'.

  • 是否使用rust :
  • 必须提供提供这些功能的特性,该特性可以在二进制文件中使用的(main.rs的)cargo.toml依赖关系引用的库代码(下面的money_typesafe)中进行定义。
  • 允许在使用二进制文件中应用特征。
  • 允许1)和2)吗?

  • 如果允许2,则在定义Trait时语法是否会以任何方式改变?
    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的情况。不知道其他选项是否存在在其他地方扩展类型的能力。
    它涉及:
  • AddAssign
  • Neg(我认为此处给出的示例无济于事。不对数字类型进行某些操作,而使用枚举只会使情况更加困惑)。
  • use std::ops::AddAssign;
    use std::ops::Neg;
    

    最佳答案

    您在问题中使用的术语有点模棱两可-我不确定您“应用”特征的含义。特质出现的三种主要方式:

  • 可以定义一个特征(在其中指定它具有的方法及其关联的类型)。
  • 可以实现特征(在某种类型上实现特征的方法)
  • 可以使用特征(将其引入作用域并调用其方法)。

  • 在哪里可以实现特征有一些限制。这些限制称为“孤立规则”,您会在this page上找到这些限制。
    该规则指出,除非在 crate 中定义了特征,和/或在 crate 中定义了要对其实现类型的类型,否则无法对类型实现特征。
    例如,您可以自由定义自己的特征,然后对外部类型(例如,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.


    否。可以在二进制 crate 中定义特征。

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


    是的,只要在二进制条板箱中定义了特征或实现该特征的类型,或两者都定义了。

    allow both 1) & 2)?


    是的,特征可以在外部或在二进制条板箱内部定义和实现,但要遵循孤立规则。

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


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

    关于rust - rust 特征。在依赖库中定义它们是习惯的做法,还是可以在使用它们的二进制代码中将Traits添加到类型中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63319764/

    相关文章:

    performance - 我应该如何有效地初始化 `Arc<[u8; 65536]>`?

    recursion - 为什么使用递归的 Hailstone Sequence 函数仅输出两个值?

    rust - 泛型生命周期具体化为引用的生命周期还是引用值的生命周期?

    rust - 我认为我没有借用的变量的生命周期错误

    java - 如何减去 Ivy 依赖集

    generics - 限制可包装使用的模板

    java - maven项目运行成功但无法构建

    java - 如何使用 Gradle 拉取 Maven 测试 jar ?

    rust - 为什么 `Self` 在编译时需要一个常量大小来调用自由函数,而等效的特征函数却不需要?

    reference - 如何在引用而不是引用值上调用特征方法?