docsによると、次のような 2 つの異なるトレイトによって提供されるメソッドを呼び出そうとすると、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
Buf
と の両方を実装しRead
ます。どちらのトレイトもbytes
メソッドを提供します。
Rust が上記と同じエラーで文句を言うと思います。代わりに、「間違った」実装を静かに選択し、後でprintln
間違ったタイプについて文句を言います。
ここでエラーが発生しない理由は何ですか?
削除すると、use std::io::Read;
すべて正常に動作します。しかし、スコープ内のその特性により、突然 Read の実装が使用され、bytes は「間違った」型になります。
(私は Rust 1.0.0 を使用しています)