rust - 为字段创建具有通用特征的结构。预期的 struct<trait> 找到了 struct<type that implements said trait>

标签 rust

我正在尝试创建一个结构,它有一个使用 Write 特性的 BufWriter,这样这个结构就可以有一个缓冲的 writer,它可以是任何实现该特征:FileStream 等。但是我的函数中存在一个问题,它创建的结构说我有不匹配的类型 .这是具有相同问题的示例代码。

use std::fs::File;
use std::io::{BufWriter, Write};

pub struct BufWriterStruct<W: Write> {
    pub writer: Option<BufWriter<W>>,
}

impl <W: Write>BufWriterStruct<W> {
    pub fn new(filename: &str) -> BufWriterStruct<W> {
        BufWriterStruct {
            writer: Some(BufWriter::new(File::create(filename).unwrap())),
        }
    }
}

fn main() {
    let tmp = BufWriterStruct::new("tmp.txt");
}

Playground

错误

error: mismatched types:
 expected `BufWriterStruct<W>`,
    found `BufWriterStruct<std::fs::File>`

如果我改为更改我的 new 函数,取而代之的是采用实现 Write 特性的参数,并在创建 BufWriter 时使用它,它就可以工作很好。

我觉得前者应该可以以某种方式实现。

最佳答案

您的错误在于混淆了通用和特定:

impl <W: Write>BufWriterStruct<W> {
    pub fn new(filename: &str) -> BufWriterStruct<W> {
        BufWriterStruct {
            writer: Some(BufWriter::new(File::create(filename).unwrap())),
        }
    }
}

在这里,您的 BufWriter 实例应该接受 W: Write,这由 调用者 决定,但该函数实际上创建了一个文件

让调用者决定:

impl <W: Write> BufWriterStruct<W> {
    pub fn new(writer: W) -> BufWriterStruct<W> {
        BufWriterStruct {
            writer: Some(BufWriter::new(writer)),
        }
    }
}

当然,这会稍微改变调用:

fn main() {
    let tmp = BufWriterStruct::new(File::create("tmp.txt").unwrap());
}

然后 it'll work .

关于rust - 为字段创建具有通用特征的结构。预期的 struct<trait> 找到了 struct<type that implements said trait>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33812706/

相关文章:

editor - Sublime Text 3 对 Rust 的支持

async-await - 如何在新的 future API 中删除 future 的类型?

logging - 如何在warp中记录请求/响应主体?

workflow - Rust 库开发工作流程

debugging - 如何查看导致编译错误的扩展宏代码?

Rust 发现,配置文件未按预期工作

multidimensional-array - Rust 多维数组行主要且紧凑吗?

for-loop - 为什么我在编译稳定代码时会收到有关缺少不稳定特征(std::iter::Step - 编译器不允许我实现)的错误?

parsing - 使用解析器组合器解析带有转义字符的字符串?

rust - 如何要求 Rust 方法的泛型移动参数与对象一样长?