Rust 为什么游标无法识别我的扩展特性?
这个问题的一个最简单的工作示例。通过阅读扩展特性,我尝试实现自己的扩展特性Rust 为什么游标无法识别我的扩展特性?,rust,Rust,这个问题的一个最简单的工作示例。通过阅读扩展特性,我尝试实现自己的扩展特性 use std::io::{Read, Cursor}; use std::io; pub trait KRead { fn read1(&mut self) -> io::Result<i32>; } impl KRead for Read { fn read1(&mut self) -> io::Result<i32> { let
use std::io::{Read, Cursor};
use std::io;
pub trait KRead {
fn read1(&mut self) -> io::Result<i32>;
}
impl KRead for Read {
fn read1(&mut self) -> io::Result<i32> {
let mut buf = [0u8];
self.read_exact(&mut buf)?;
Ok(buf[0] as i32)
}
}
fn main() -> io::Result<()> {
let input_data = [47u8, 56u8];
let mut input_buffer = Cursor::new(input_data);
assert_eq!(47, input_buffer.read1()?);
assert_eq!(56, input_buffer.read1()?);
Ok(())
}
使用std::io::{Read,Cursor};
使用std::io;
酒馆{
fn read1(&mut self)->io::Result;
}
用于读取的impl KRead{
fn read1(&mut self)->io::Result{
设mut buf=[0u8];
自读准确(&mut buf)?;
正常(buf[0]为i32)
}
}
fn main()->io::Result{
让输入_数据=[47u8,56u8];
让mut input_buffer=Cursor::new(输入_数据);
断言(47,输入缓冲区.read1()?);
断言(56,输入缓冲区.read1()?);
好(())
}
但是编译失败了
No method named `read1` found for struct `std::io::Cursor<[u8; 2]>` in the current scope
No method named `read1` found for struct `std::io::Cursor<[u8; 2]>` in the current scope
在当前作用域中找不到结构`std::io::Cursor`的名为`read1`的方法
在当前作用域中找不到结构'std::io::Cursor'的名为'read1'的方法
但是Cursor
实现了Read
,所以我认为它会自动获取我的扩展特性。我做错了什么
impl KRead for Read {
...
}
如果您在Rust的最新版本上编译此文件,您应该会收到警告
warning: trait objects without an explicit `dyn` are deprecated
那是因为你写的实际上是
impl KRead for dyn Read {
...
}
也就是说,您没有说“每个读取的都是KRead
”。您已经说过“具体来说,trait对象类型dyn Read
是一个KRead
”,它的范围要窄得多,用处也小得多。如果需要前者,则需要使用泛型类型参数
impl<T> KRead for T where T: Read {
fn read1(&mut self) -> io::Result<i32> {
let mut buf = [0u8];
self.read_exact(&mut buf)?;
Ok(buf[0] as i32)
}
}
T的impl KRead,其中T:Read{
fn read1(&mut self)->io::Result{
设mut buf=[0u8];
自读准确(&mut buf)?;
正常(buf[0]为i32)
}
}
如果您在Rust的最新版本上编译此文件,您应该会收到警告
warning: trait objects without an explicit `dyn` are deprecated
那是因为你写的实际上是
impl KRead for dyn Read {
...
}
也就是说,您没有说“每个读取的都是KRead
”。您已经说过“具体来说,trait对象类型dyn Read
是一个KRead
”,它的范围要窄得多,用处也小得多。如果需要前者,则需要使用泛型类型参数
impl<T> KRead for T where T: Read {
fn read1(&mut self) -> io::Result<i32> {
let mut buf = [0u8];
self.read_exact(&mut buf)?;
Ok(buf[0] as i32)
}
}
T的impl KRead,其中T:Read{
fn read1(&mut self)->io::Result{
设mut buf=[0u8];
自读准确(&mut buf)?;
正常(buf[0]为i32)
}
}