gpt4 book ai didi

vector - 将值非破坏性地附加到向量的惯用方法是什么?

转载 作者:行者123 更新时间:2023-11-29 08:27:16 25 4
gpt4 key购买 nike

我有一个程序,其中我 fold在一个字符串向量上,递增一个值并在其上构建另一个向量。像这样:

struct Widget { foo: isize, text: &'static str }
let foos = vec!["a", "b", "c"];
let (final, ws) = foos.iter().fold((0, widgets), |(x, ws), text| {
(x+1, Widget { foo: x, text: text })
});

上面代码的问题是我需要附加新的小部件到ws ,不返回新的小部件代替 ws .为此,我需要一种非破坏性地将值附加到向量的方法。这是我正在寻找的函数的大致签名:

fn append<T>(vec: Vec<T>, item: T) -> Vec<T>

我好像找不到这样的函数。看起来这个(或者这个作为 Vec 上的方法)对于 Rust 来说是非常惯用的,但它只是不存在。是否有另一种更惯用的方法来实现它,或者是否有类似上述的功能?

最佳答案

non-destructively append a value to a vector

这是不可能的。修改矢量...修改它。你无法解决这个问题。您可以选择克隆 向量,这样可以避免改变原始 向量。但是,您仍然需要改变克隆:

let things = vec![1];
let things2 = {
let mut tmp = things.clone();
tmp.push(2);
tmp
};

如果你用完了原始向量,你可以重用它:

let things = vec![1];
let things2 = {
let mut tmp = things;
tmp.push(2);
tmp
};

这可以提取到您想要的函数签名中:

fn append(vec: Vec<i32>, item: i32) -> Vec<i32> {
let mut vec = vec;
vec.push(item);
vec
};

惯用但等价地写成

fn append(mut vec: Vec<i32>, item: i32) -> Vec<i32> {
vec.push(item);
vec
};

let things = vec![1];
let things2 = append(things.clone(), 2);
let things2 = append(things, 2);

It seems like this (or this as a method on Vec) would be very idiomatic for Rust

不是真的 - 要拥有此方法签名,您必须拥有 Vec。更常见的是只有对 Vec 的可变引用,它提供了一组不同的功能。

有一些关于为 Vec 实现 Add 的讨论,这可能允许类似 let things2 = things + 2 的东西,但我不'知道去任何地方。


为了它的值(value),我会把你的代码写成:

let foos = ["a", "b", "c"];

let ws: Vec<_> = foos.iter()
.enumerate()
.map(|(i, text)| Widget { foo: i as isize, text })
.collect();

关于vector - 将值非破坏性地附加到向量的惯用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45090958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com