小编Jak*_*keK的帖子

我可以在运行时选择一个特征对象而不使用 Box<Trait> 吗?

我想分支并决定在运行时在函数中使用的 Trait 实现(请参见poly_read下面的代码示例)。特征对象是在 if 表达式的分支臂内部构造的,并且只需要在生命周期内存在,poly_read但我需要Box它,因为特征不能从表达式臂内借用,直到我所绑定的绑定为止。尝试将其分配给。

我从逻辑上理解为什么借用结束得太早,但似乎借用检查器应该能够在 if 表达式的值被绑定时将借用扩展到周围范围。我意识到这可能是一个天真的想法,但我想更多地了解为什么这是不可能的。

我对现在的解决方案有点不满意,因为它需要堆分配,尽管我觉得我不应该需要堆分配,因为我只在函数的生命周期内保留该框。我想这是因为在采用分支之前我们不知道reader堆栈上需要的大小,但它不能在编译器中表示为联合,因为我们至少知道最大大小。

顺便说一句,我实际上不知道我对Box堆分配的担忧有多么合理。一般来说,拳击的价值有多贵?

#![feature(io)]
#![feature(path)]

const BYTES: &'static [u8] = &[1u8, 2, 3, 4, 5];
const PATH: &'static str = "/usr/share/dict/words";

use std::old_io::{File, Reader, BufReader};


fn read(r: &mut Reader) {
    let some_bytes = r.read_exact(5).unwrap();
    assert!(some_bytes.len() == 5);
    println!("{:?}", some_bytes);
}

fn poly_read(from_file: bool) {
    // Is there any way to extend the lifetime of the ``&mut Reader`` in these branch arms without
    // …
Run Code Online (Sandbox Code Playgroud)

lifetime rust

5
推荐指数
1
解决办法
739
查看次数

标签 统计

lifetime ×1

rust ×1