16

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::RingBufBufと の両方を実装しReadます。どちらのトレイトもbytesメソッドを提供します。

Rust が上記と同じエラーで文句を言うと思います。代わりに、「間違った」実装を静かに選択し、後でprintln間違ったタイプについて文句を言います。

ここでエラーが発生しない理由は何ですか?

削除すると、use std::io::Read;すべて正常に動作します。しかし、スコープ内のその特性により、突然 Read の実装が使用され、bytes は「間違った」型になります。

(私は Rust 1.0.0 を使用しています)

4

1 に答える 1

7

@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 のバグです。詳細については、対応するRust issueを参照してください。

于 2015-06-08T16:49:41.493 に答える