gpt4 book ai didi

rust - 无法调用 fn from an impl because X is not satisfied for T

转载 作者:行者123 更新时间:2023-11-29 08:26:49 24 4
gpt4 key购买 nike

我有一个特性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);
}
}

这里我的错误是什么,我该如何解决。

(链接到 playground)

最佳答案

如果您希望将 print_fd() 与引用一起使用,您必须这样做:

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

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

或者你必须以 self 为值(value):

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());
}
}

关于rust - 无法调用 fn<T : X> from an impl<T: X> because X is not satisfied for T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52613313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com