通过不同的实现重用具有多种特征类型的变量

问题描述 投票:0回答:1

我有一个读者变量,应该由另一个读者有条件地重新分配。但我使用了两个 Rust 不支持的特征。使用两个特征定义新特征不是一种选择,因为这不再与多个特征兼容。

如何让它发挥作用?

use std::io::{BufReader, Read, Result, Seek};
use std::fs::File;

fn do_something_with_reader<R: Read + Seek>(reader: &mut R) {
    // ...
}

fn main() -> std::io::Result<()> {
    let mut reader: Box<dyn Read + Seek> = Box::new(File::open("some_file.txt")?);
    if true /* some condition */ {
        // BufReader is for demonstration only. I'm using custom structs.
        reader = Box::new(BufReader::new(reader));
    }
    do_something_with_reader(&mut reader);
    Ok(())
}

Box<dyn Read + Seek>
不起作用。如何在不失去与
Read + Seek
兼容性的情况下完成此操作?

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=78ce2e1b7f4dbbcd492c53895dabf39b

rust traits
1个回答
0
投票

这是不可能的,请参阅我可以在不使用泛型类型的情况下获取多特征实例的特征对象吗?

但我想对于你的情况你可以使用这个解决方法:

use std::io::{BufReader, Read, Result, Seek};
use std::fs::File;

trait ReadSeek : Read + Seek {}

impl<T : Read + Seek> ReadSeek for T {}

fn do_something_with_reader(reader: &mut dyn ReadSeek) {
    // ...
}

fn main() -> std::io::Result<()> {
    let mut reader: Box<dyn ReadSeek> = Box::new(File::open("some_file.txt")?);
    if true /* some condition */ {
        // BufReader is for demonstration only. I'm using custom structs.
        reader = Box::new(BufReader::new(reader));
    }
    do_something_with_reader(&mut reader);
    Ok(())
}
© www.soinside.com 2019 - 2024. All rights reserved.