rust - 如何返回包含通用值的向量

标签 rust

我试图从函数返回一个向量,但编译器给我以下错误消息:

 expected `Foo<T>`,
    found `Foo<&str>`
(expected type parameter,
    found &-ptr) [E0308]

我在这里错过了什么?

struct Foo<T> {
    bar: T,
}


fn foos<T>() -> Vec<Foo<T>> {
    vec![
        Foo { bar: "x" },
        Foo { bar: 1 },
    ]
}



fn main() {
    let my_foos: Vec<_> = foos();

    println!("{}", my_foos[0].bar);
}

最佳答案

编译器在这里给你一个很好的错误信息:

expected `Foo<T>`,
   found `Foo<&str>`

也就是说,您不会返回一些通用的 T ,您正在返回一个具体类型。实际上,您并不是只返回一种类型,而是试图返回两种不同类型!

每次解析泛型时,它都必须解析为单一类型。也就是说,您可以调用foo<T>(a: T, b: T)有两个u32或两个 bool ,但每一个。

为了让您的代码以最直接的方式工作,您可以使用枚举。这将创建一个可以具有一组值中的一个的类型:

struct Foo<T> {
    bar: T,
}

#[derive(Debug)]
enum Bar<'a> {
    Num(i32),
    Str(&'a str),
}

// Note no generics here, we specify the concrete type that this `Foo` is
fn foos() -> Vec<Foo<Bar<'static>>> {
    vec![
        Foo { bar: Bar::Str("x") },
        Foo { bar: Bar::Num(1) },
    ]
}

fn main() {
    let my_foos: Vec<_> = foos();

    println!("{:?}", my_foos[0].bar);
}

关于rust - 如何返回包含通用值的向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29581855/

相关文章:

module - 如何在库本身中使用库示例中的代码?

rust - 创建具有自定义错误类型的 super 服务

dart - 如何在Dart FFI中使用 bool 类型?

rust - 元变量周围带有引号的宏

generics - 当其中一个是本地引用时,如何在类型约束中编写引用的生命周期?

rust - 如何从流中读取特定数量的字节?

string - 用字符串中的其他 ASCII 字符替换某些 ASCII 字符的简洁和安全的方法

rust - 使用 Nom 5 解析带有转义引号的单引号字符串

rust - 将柴油过滤器应用于单表还是连接表?

rust - std::net::TcpStream 写入或刷新阻塞操作吗?