【问题标题】:Ensure that a trait implementation in rust satisfy properties确保 rust 中的 trait 实现满足属性
【发布时间】:2019-07-11 03:43:05
【问题描述】:

我正在制作一个特征来定义度量空间中的距离,例如:

trait Metric<T> {
    fn distance(o1: &T, o2: &T) -> f64;
}

我希望任何实现都满足某些属性,例如:

distance(o, o) = 0.0

是否存在 rust 中的方法来强制执行该操作?

【问题讨论】:

  • 我认为没有,您可以对返回类型进行某种保护,但在某些时候它不是很实用,这是实现正确的责任。进行单元测试等。
  • 您可以使用assert_eq!,如果距离无效,则返回Option/Result

标签: rust traits


【解决方案1】:

您可以使用trait_tests crate,尽管我相信板条箱只是一个实验,所以可能会有粗糙的边缘。 具体来说,我不知道如何实际测试Metric&lt;T&gt; 的所有实现,而只是测试具体类型Metric&lt;i32&gt;

你的例子:

use trait_tests::*;

pub trait Metric<T> {
    fn distance(o1: &T, o2: &T) -> f64;
}

#[trait_tests]
pub trait MetricTests: Metric<i32> {
    fn test_distance() {
        // These could possibly be extended using quickcheck or proptest
        assert!(Self::distance(&42, &42) == 0.0);
    }
}

struct CartesianPlane {}

#[test_impl]
impl Metric<i32> for CartesianPlane {
    fn distance(o1: &i32, o2: &i32) -> f64 {
        (*o2 - *o1) as f64
    }
}

那么cargo test 应该包含为带有#[test_impl] 注释的特征实现者自动生成的测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-13
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 2023-03-06
    • 2023-03-26
    相关资源
    最近更新 更多