确保 rust 中的 trait 实现满足属性

Ensure that a trait implementation in rust satisfy properties

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

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

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

1
distance(o, o) = 0.0

是否存在一种在 rust 中强制执行的方法?


你可以使用 trait_tests 板条箱,虽然我相信这个板条箱只是一个实验,所以可能会有粗糙的边缘。
具体来说,我不知道如何实际测试 Metric<T> 的所有实现,而只是测试具体类型 Metric<i32>.

举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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] 注释的特征的实现者自动生成的测试。