- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
具有对象安全特性的模式 Foo
和一个(可能不安全的)扩展特征 FooExt
为 Foo
的所有实例实现现在似乎已成为标准。
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/
我想做如下的事情: class Foo(object): def __init__(self): self.member = 10 pass def facto
我是一名优秀的程序员,十分优秀!