trait Graph { type N; type E; fn has_edge(&self, _: &Self::N, _: &Self::N) -> bool; fn edges(&self, _: &Self::N) -> Vec<Self::E> }使用关联类型提高了代码的可读性。Graph 的客户端确实可以使用它,而不需要每次都指定其关联的类型是什么,这对于泛型类型来说是必需的。例如:
fn distance<C: Contains>(graph: &G, start: &G::N, end: &G::N) -> i32 { ... }现在,GTA 引入了一种方法来指定本身就是泛型的关联类型。例如:
trait LendingIterator { type Item<'a> where Self: 'a; fn next<'a>(&'a mut self) -> Option<Self::Item<'a>>; }将其与标准 Iterator 的定义进行比较:
pub trait Iterator { type Item; ... fn next(&mut self) -> Option<Self::Item> ... }如你所见,LendingIterator 使用 Item<'a>而不是非泛型的 Item 相关类型,并将 Self 约束为类型'a。这意味着 next 函数将返回一个从 self 借用的项。
由于循环块支持任意时候跳出循环,标记的 break 让已经使用只执行一次的 loop 块来实现的行为变得更完整了。现在,你还可以标记一个块,然后使用 break <块标记>语句跳转到这个标记块的末尾。
如果你对 Rust 1.65 的详细变更感兴趣,请查看官方发布说明。