gpt4 book ai didi

rust - 在处理 if/else 中的不兼容类型时如何删除重复?

转载 作者:行者123 更新时间:2023-11-29 08:18:53 25 4
gpt4 key购买 nike

我有一个方法 decode_message有 2 个实现,一个用于 BufReader<Read>另一个是BufReader<Read + Seek> .特化已启用。

if is_stdin {
let mut reader = BufReader::with_capacity(1000, io::stdin());
decode_message(reader)
} else {
let filename = &args[1];
let mut reader = BufReader::with_capacity(1000, File::open(filename).unwrap());
decode_message(reader)
};

上面的代码有效,但我不得不重复一遍很烦人 decode_message在每个分支中。

最佳答案

就您的问题而言,特化不是罪魁祸首,它只是单态的使用:reader给定 BufReader::new 的定义,在两个条件范围内定义的绑定(bind), 将不同,不能分配给相同的绑定(bind)。每次运行时条件导致值类型的分歧,例如在这种情况下,它们也会导致无法在它们之间共享的代码例程。

当然,这有一个异常(exception):特征对象的具体类型被删除,因此绑定(bind) reader: BufReader<Box<Read>> ,甚至 reader: Box<BufRead> , 可以容纳条件语句中的两个读者中的任何一个。但是,生成的代码可能不会执行得更好,因为它会导致方法解析的运行时成本,并阻止一些提前优化。

因此,几乎没有比您已有的方法更好的方法了。事实上,这里的一个很好的模式已经应用在你的例子中:你可以使用单态函数来包含从单态中分离出来的剩余逻辑,直到它收敛到相同的类型。有了它,你只需要重复一个decode_message()调用而不是其中的所有内容。

关于rust - 在处理 if/else 中的不兼容类型时如何删除重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44069757/

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