实现相同方法的两个特性没有错误



根据文档,如果我尝试调用由两个不同的特性提供的方法,Rust应该会报错,就像这样:

trait Foo {
    fn f(&self);
}
trait Bar {
    fn f(&self);
}
struct Baz;
impl Foo for Baz {
    fn f(&self) { println!("Baz’s impl of Foo"); }
}
impl Bar for Baz {
    fn f(&self) { println!("Baz’s impl of Bar"); }
}
fn main(){
    let b = Baz;
    b.f();
}

运行此命令将导致预期的error: multiple applicable methods in scope错误。

但是我没有得到错误:

extern crate mio;
use mio::buf::RingBuf;
use mio::buf::Buf;
use std::io::Read;
fn main() {
    let buf = RingBuf::new(10);
    let bytes = buf.bytes();
    println!("{:?}", bytes);
}

mio::buf::RingBuf实现了BufRead。这两个特性都提供了一个bytes方法。

我希望Rust会报错与上面相同的错误。相反,它默默地选择了"错误的"实现,后来println抱怨错误的类型。

知道为什么这里没有错误吗?

如果我删除use std::io::Read;一切工作正常。但是,由于该特性的作用域,突然使用了Read的实现,并且bytes具有"错误"的类型。

(我使用Rust 1.0.0)

@bluss发现问题:

struct Type;
trait A {
    fn foo(&self) -> bool { false }
}
trait B : Sized {
    fn foo(self) -> bool { true }
}
impl A for Type { }
impl B for Type { }
fn main() {
    println!("{}", Type.foo());   // This will call B::foo -- it will prefer `self`.
}

如果两种类型都使用稍有不同的self类型,Rust会将它们视为不同的,调用方法时会选择其中一种。

这可能是Rust中的一个bug。有关详细信息,请查看相应的Rust问题。

相关内容

  • 没有找到相关文章

最新更新