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 中强制执行的方法?
你可以使用
具体来说,我不知道如何实际测试
举个例子:
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 } } |
然后