我想创建一个Ord实例,它通过struct field比较我的对象。也许我在这里遗漏了一些东西
#[deriving(Eq, Clone)]
struct SortableLine<T>{
comparablePart: ~T,
line: ~str
}
impl Ord for SortableLine<~Ord>{
fn lt(&self, other: &SortableLine<~Ord>) -> bool{
return self.comparablePart.lt(&other.comparablePart);
}
}
失败
由于 不能通过对象调用其类型包含自我类型的方法
有没有办法根据字段比较的顺序对父对象进行排序?
答案 0 :(得分:2)
您的类型参数是问题;当你不是实际得到或想要的东西时,你正试图使用特质对象。以下是如何实现它:使用泛型。
#[deriving(Eq, Clone)]
struct SortableLine<T>{
comparable_part: ~T,
line: ~str
}
impl<T: Ord> Ord for SortableLine<T> {
fn lt(&self, other: &SortableLine<T>) -> bool {
return self.comparable_part < other.comparable_part;
}
}
请注意其他两项更改:
a < b
而不是a.lt(&b)
。我认为它更简单,但在Ord
impl中它不那么重要。comparablePart
更改为comparable_part
(哦,并在几个地方间隔)以适应标准的Rust样式。这种事情具有通常方便的副作用,你不需要它是SortableLine
;它可以只是一个Line
,如果它是由可订购部件组成的,那么它将是可订购的,如果不是,则可以订购。