如何避免重复调用具有适合相同泛型参数的不同类型参数的函数?

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

我对 rust 很陌生,所以我立刻承认可能有更好的第三种方法来做到这一点,但我对更有经验的人所说的非常感兴趣。

给定一个带有签名的通用函数:

fn process_lines<T: BufRead + Sized>(reader: T, re: Regex) {

更“传统”的 Rust 调用方法是什么?

有一个直接的方法:

match input {
    "-" => {
        let stdin = io::stdin();
        process_lines(stdin.lock(), re)
    }
    _ => {
        let f = File::open(input).unwrap();
        process_lines(BufReader::new(f), re)
    }
};

在其他语言中,我会通过做一些我认为会翻译成这样的事情来避免多次写出函数调用:

let reader: Box<dyn BufRead> = match input {
    "-" => {
        let stdin = io::stdin();
        Box::new(stdin.lock())
    }
    _ => {
        let f = File::open(input).unwrap();
        Box::new(BufReader::new(f))
    }
};

process_lines(reader, re);

除了调用 Box 之外,还有更好的方法来构造

reader
吗?

这是一个超级微不足道的情况,但我担心我会陷入某种心理陷阱,以我习惯的方式做事......

我知道使用 Box 会带来一些性能损失...但我想这更多是某种嵌套控制流中的问题。

这些模式中的哪一个在大型 Rust 代码库中扩展得更好,或者它始终是每种情况的调用?

对这种二分法的任何和所有见解(或者如果确实存在第三种方法,则为错误的二分法)真的很感激!

generics rust existential-type
1个回答
0
投票

临时生命周期延长已在 Rust 1.79 中实现,这使得可以这样写:

let reader: &mut dyn BufRead = match input {
    "-" => &mut std::io::stdin().lock(),
    _ => {
        let file = std::fs::File::open(input).unwrap();
        &mut std::io::BufReader::new(file)
    }
};

process_lines(reader, re);

if
match
和原始块中生成的临时值(带有脱离块范围的借用)将具有延长的生命周期以匹配借用的生命周期。

这对于许多旧版本不支持的动态调度情况很有用。

© www.soinside.com 2019 - 2024. All rights reserved.