Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 为什么游标无法识别我的扩展特性?_Rust - Fatal编程技术网

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