如何将&[u8]转换为Vec<u8>?

60

我试图将一个切片简单地转换为向量。以下是代码:

let a = &[0u8];
let b: Vec<u8> = a.iter().collect();

发生以下错误信息:

3 |     let b: Vec<u8> = a.iter().collect();
  |                               ^^^^^^^ a collection of type `std::vec::Vec<u8>` cannot be built from an iterator over elements of type `&u8`

我错过了什么?


u8 不等于 &u8。可能是 https://dev59.com/aoHba4cB1Zd3GeqPQ2zT 的重复,但自那时以来语法略有改变。 - Stefan
@Stefan u8 和字符串有什么关系? - user8370684
让a = &[0u8]; 让b:Vec<&u8> = a.iter().collect(); @Roxy,我尝试了这个方法,它对我有效。如果我们将b:Vec的泛型设为&u8。 - Ranjith Raj D
3个回答

102

将元素收集到 Vec 中是非常常见的操作,因此切片有一个名为 to_vec 的方法可以完美地完成这个任务:

let b = a.to_vec();

您将得到与CodesInChaos的答案相同的结果,但更加简洁。

请注意,to_vec需要T:Clone。要从&[T]中获取Vec<T>,您必须能够从非拥有&T中获取拥有的T,这就是Clone的作用。

切片还实现了ToOwned,因此如果您想对不同类型的非拥有容器进行通用化,可以使用to_owned而不是to_vec。如果您的代码仅适用于切片,请使用to_vec


我实际上需要做一些更复杂的事情,不幸的是 to_vec 不起作用。我得到的错误是:error[E0599]: no method named to_vec found for type std::iter::Take<std::iter::Cycle<std::slice::Iter<'_, u8>>> in the current scope - user8370684
1
@Roxy 这是一个不同的问题:“如何将迭代器转换为Vec?” .collect() 绝对是这个问题的正确答案。 - trent

19

迭代器仅返回对元素的引用(此处为&u8)。若需获取拥有所有权的值(此处为u8),您可以使用.cloned()

let a: &[u8] = &[0u8];
let b: Vec<u8> = a.iter().cloned().collect();

1

最清晰的写法就是简单明了地表达

let b = Vec::from(a);

这段代码清晰地表明你正在使用 from 风格的构造函数构建一个 Vec 对象(类型名称在同一行上)。 (再次强调,构造函数的存在使这一点变得清晰明了。)

使用 to_vec 几乎同样清晰,但我想 to_vec 可能是作用域内的任意函数,可以执行几乎任何操作,并且它不包含类型名称 Vec


如果它是关于切片的,那么肯定是使用 to_vec() 方法。如果这个方法被改成了其他类型,那么如果有人创建了一个名为 to_vec() 的方法,但它并不返回 Vec 类型……那么,我想这就是一个非常糟糕的设计。 - Chayim Friedman
@GolezTrol to_vec()函数的存在是为了让人们使用它。这是最惯用的解决方案,否则这个函数就不会存在。 - Chayim Friedman
你可以用同样的话说“from”,对吧?有两种方法可以做到这一点。其中一种方法是什么让它变得错误? - GolezTrol
1
@GolezTrol 不,同样的论点不适用于 from(),原因很简单:to_vec() 是一个内在方法。它只能直接调用。因此,它是 被设计 直接调用的。另一方面,from()(和 to_owned())是 trait 实现,在任何需要 impl Into<Vec> 的情况下都很有用,即使它们没有直接使用。 - Chayim Friedman
1
我曾经认为from是一个构造函数。现在我认为它更像是一个通用的转换函数。如果将其视为构造函数,从字符串构造一个复杂类型几乎没有意义。然而,作为一个通用的转换函数,将字符串转变为更复杂的类型确实是有意义的。to_vec表明你的类型知道如何将自己转换为Vec,这对于一个类型来说很少是明智的事情,除非它与Vec类型本身紧密耦合。(因此切片可以调用to_vec - FreelanceConsultant
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接