Нет ошибки для двух признаков, реализующих один и тот же метод
Согласно документам, 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, и байты имеют "неправильный" тип.
(Я использую Rust 1.0.0)
1 ответ
@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
type, Rust рассматривает их как разные, и вызов метода просто предпочитает один из них.
Это, вероятно, ошибка в Rust. Для подробностей взгляните на соответствующую проблему Rust.