【问题标题】:Get array slice of str from vector of objects containing str从包含 str 的对象的向量中获取 str 的数组切片
【发布时间】:2022-01-13 00:18:56
【问题描述】:

我有一个包含字符串切片的字段的对象/实例向量(不确定 rust 用语是什么)。我需要创建一个包含字符串切片字段的数组切片。下面是我的尝试。我试图让foo_barswhat_i_want 相同。

struct Foo<'a> {
    bar: &'a str,
}
let foos = vec![Foo { bar: "one" }, Foo { bar: "two" }, Foo { bar: "three" }];
let foo_bars: Vec<str> = foos.into_iter().map(|foo| foo.bar).collect();

let what_i_want = &["one", "two", "three"];

【问题讨论】:

    标签: arrays rust slice


    【解决方案1】:

    您在Vec&lt;&amp;str&gt; 中缺少&amp;

    这是一个有效的playground

    struct Foo<'a> {
        bar: &'a str,
    }
    
    fn main() {
        let foos = vec![Foo { bar: "one" }, Foo { bar: "two" }, Foo { bar: "three" }];
        let foo_bars: Vec<&str> = foos.into_iter().map(|foo| foo.bar).collect();
    
        let what_i_want = &["one", "two", "three"];
    
        println!("{:?}", foo_bars == what_i_want);
    }
    

    【讨论】:

      【解决方案2】:

      一切都必须有固定的大小,str表示字符串中的一个字符范围,字符串切片的大小可以很大。

      您需要使用指针&amp;。指针是固定大小的 (usize)。取决于 cpu 架构(32 或 64)位。

      let foo_bars: Vec< str> = foos.into_iter().map(|foo| foo.bar).collect();
                        ^ add a `&` here
      

      【讨论】:

      • str 的引用实际上是双倍大小的,一个指向开头的指针和一个长度为usize
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 2020-09-02
      • 1970-01-01
      • 2021-02-07
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多