代码之家  ›  专栏  ›  技术社区  ›  Jay

如何将rust Vec转换为对数组的引用

  •  0
  • Jay  · 技术社区  · 2 年前

    在最新版本的rust中,将Vec转换为数组的最佳方法是什么?(假设Vec中的类型与数组中所需的类型相同。)

    即解决错误,例如:

    error[E0308]: mismatched types
      --> src/form.rs:96:20
       |
    96 |             gloss: &gloss,
       |                    ^^^^^^ expected `&[&Gloss<'_>]`, found `&Vec<Gloss<'_>>`
       |
       = note: expected reference `&[&gloss::Gloss<'_>]`
                  found reference `&Vec<gloss::Gloss<'_>>`
    

    或者:

    error[E0308]: mismatched types
      --> src/lexeme.rs:58:24
       |
    58 |                 gloss: &entry,
       |                        ^^^^^^ expected `&[&str]`, found `&Vec<&&str>`
       |
       = note: expected reference `&[&str]`
                  found reference `&Vec<&&str>`
    

    (我有一个build.rs文件,它正在解析文本输入并创建永远不会更改的静态/常量数组,所以我不能使用 Vec 在结构中)

    1 回复  |  直到 2 年前
        1
  •  4
  •   jthulhu    2 年前

    这不是转弯 Vec 转换为数组。您正试图将 Vec 拥有价值的 切成一片 参考文献 。它们包含不同的类型,因此在不分配额外空间的情况下无法进行转换。您可能需要更新您的函数签名才能接受 &[Gloss<'_>] 而不是 &[&Gloss<'_>]

    使用 &[&str] 很好,但是 Vec<&&str> 由于双重引用,这似乎是一个错误。也许您正在从的迭代器中收集 &&str ?

    如果类型正确,则不需要转换。即。

    pub struct MyStruct<'a> {
        items: &'a [&'a str],
        gloss: &'a [Gloss<'a>], // not &Gloss
    }
    
    ...
    let mut items: Vec<&str> = Vec::new();
    let mut glosses: Vec<Gloss> = Vec::new();
    ...
    let i = MyStruct{
        items: &items,
        gloss: &glosses,
    }
    
    推荐文章