Według the docs, Rust powinien narzekać jeśli próbuję wywołać metodę dostarczone przez dwóch różnych cech tak:Brak błędu na dwie cechy realizacji tego samego sposobu
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();
}
Running skutkuje oczekiwanym error: multiple applicable methods in scope
błędu.
Jednak mam żadnego błędu w tym:
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
realizuje zarówno Buf
i Read
. Obie cechy zapewniają metodę bytes
.
Spodziewałbym się, że Rust złoży skargę z tym samym błędem co powyżej. Zamiast tego po cichu wybiera "niewłaściwą" implementację, a później println
narzeka na niewłaściwy typ.
Każdy pomysł, dlaczego nie mam tutaj błędu?
Po usunięciu use std::io::Read;
wszystko działa poprawnie. Jednak z tą cechą w zakresie nagle zastosowana jest implementacja Read, a bajty mają "zły" typ.
(Używam Rust 1.0.0)
Proszę zgłosić to na [tracker problemu rdzy] (https://github.com/rust-lang/rfcs/issues) – bluss
Już zrobiłem: https://github.com/rust-lang/rust/issues/ 26080 - nie jestem pewien, czy to było idealne miejsce. – michas
dziękuję, myślę, że to jest miejsce – bluss