Rust出错:无法通过对象调用其类型包含自我类型的方法

时间:2013-10-29 23:01:57

标签: rust

我想创建一个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);
    }
}

失败

由于     不能通过对象调用其类型包含自我类型的方法

有没有办法根据字段比较的顺序对父对象进行排序?

1 个答案:

答案 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;
    }
}

请注意其他两项更改:

  1. 我使用a < b而不是a.lt(&b)。我认为它更简单,但在Ord impl中它不那么重要。
  2. 我将comparablePart更改为comparable_part(哦,并在几个地方间隔)以适应标准的Rust样式。
  3. 这种事情具有通常方便的副作用,你不需要它是SortableLine;它可以只是一个Line,如果它是由可订购部件组成的,那么它将是可订购的,如果不是,则可以订购。