gpt4 book ai didi

iterator - 解决扩展特征的局限性

转载 作者:行者123 更新时间:2023-11-29 07:45:48 25 4
gpt4 key购买 nike

具有对象安全特性的模式 Foo和一个(可能不安全的)扩展特征 FooExtFoo 的所有实例实现现在似乎已成为标准。

https://github.com/rust-lang/rfcs/pull/445

对于 Iterator<A> 这对我来说是个问题,因为我有一个覆盖默认方法的库 IteratorExt#last()旧的迭代器特征(底层库有一个有效的实现 last() )。这在现在是不可能的,因为对于任何 A , IteratorExt 总是会有冲突的特征实现,那个libcore已经为所有 Iterator<A> 提供.

iterator.rs:301:1: 306:2 error: conflicting implementations for trait `core::iter::IteratorExt` [E0119]

iterator.rs:301 impl<'a, K: Key> iter::IteratorExt<Vec<u8>> for ValueIterator<'a,K,Vec<u8>> {
iterator.rs:302 fn last(&mut self) -> Option<Vec<u8>> {
iterator.rs:303 self.seek_last();
iterator.rs:304 Some(self.value())
iterator.rs:305 }
iterator.rs:306 }
...

现在,据我所知,我有两个选择:

  • 有我自己的特点和我自己last()执行。如果IteratorExt,那将意味着它会发生冲突除非小心使用,否则是进口的。这也有意外使用低效版本 last() 的危险。如果来自 IteratorExt 的版本用来。我会失去对 IteratorExt 的方便访问.
  • 有我自己的特征并以不同的方式命名方法(seek_last())。缺点:我要求用户学习词汇,并且总是喜欢我的方法而不是 IteratorExt 提供的方法。 .同样的问题:我想避免意外使用 last() .

我还缺少其他更好的解决方案吗?

最佳答案

rustc 0.13.0-nightly (8bca470c5 2014-12-08 00:12:30 +0000) 开始,将 last() 定义为您的固有方法类型应该有效。

#[deriving(Copy)]
struct Foo<T> {t: T}

impl<T> Iterator<T> for Foo<T> {
fn next(&mut self) -> Option<T> { None }
}

// this does not work
// error: conflicting implementations for trait `core::iter::IteratorExt` [E0119]
// impl<T> IteratorExt<T> for Foo<T> {
// fn last(mut self) -> Option<T> { None }
//}

// but this currently does
impl<T> Foo<T> {
fn last(mut self) -> Option<T> { Some(self.t) }
}


fn main() {
let mut t = Foo{ t: 3u };
println!("{}", t.next())
println!("{}", t.last()) // last has been "shadowed" by our impl
println!("{}", t.nth(3)) // other IteratorExt methods are still available
}

由于您不应该将扩展特征用作通用边界(而只是为了提供额外的方法),这在理论上应该适用于您的场景,因为您可以拥有自己的类型及其 impl在同一个箱子里。

您的类型的用户将使用固有的 last 方法而不是 IteratorExt 上的方法,但仍然能够在 IteratorExt 上使用其他方法>.

关于iterator - 解决扩展特征的局限性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27267767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com