Не могу позвонитьот имплпотому что X не удовлетворен для T - PullRequest
0 голосов
/ 02 октября 2018

У меня есть черта RawFd, которая реализована для каждого типа, удовлетворяющего особым требованиям.

Теперь у меня есть функция, которая принимает любой тип, который реализует RawFd.И у меня есть черта с реализацией для каждого T, которая реализует RawFd.

Однако я не могу вызвать свою функцию из моей черты, даже если T реализует RawFd:

pub trait RawFd {
    fn raw_fd(&self) -> u64;
}

#[cfg(unix)]
impl<T: std::os::unix::io::AsRawFd> RawFd for T {
    fn raw_fd(&self) -> u64 { self.as_raw_fd() as u64 }
}

#[cfg(windows)]
impl<T: std::os::windows::io::AsRawSocket> RawFd for T {
    fn raw_fd(&self) -> u64 { self.as_raw_socket() as u64 }
} 

fn print_fd<T: RawFd>(p: T) {
    println!("{}", p.raw_fd());
}

trait Printable {
    fn print(&self);
}

impl<T: RawFd> Printable for T {
    fn print(&self) {
        print_fd(self);
    }
}

В чем здесь моя ошибка и как я могу ее исправить.

(ссылка на детская площадка )

1 Ответ

0 голосов
/ 02 октября 2018

Если вы планируете использовать print_fd() со ссылкой, вы должны сделать это:

fn print_fd(p: &impl RawFd) {
    println!("{}", p.raw_fd());
}

или

fn print_fd<T: RawFd>(p: &T) {
    println!("{}", p.raw_fd());
}

Или вы должны взять self по значению:

impl<T: RawFd> Printable for T {
    fn print(self) {
        print_fd(self);
    }
}

Или вы можете использовать клон:

impl<T> Printable for T where T: Clone + RawFd {
    fn print(&self) {
        print_fd(self.clone());
    }
}
...