gpt4 book ai didi

rust - 为字段创建具有通用特征的结构。预期的 struct 找到了 struct

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

我正在尝试创建一个结构,它有一个使用 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/

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