gpt4 book ai didi

functional-programming - 如何像JavaScript的解构一样加入数组?

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

我想创建一个函数来接收 Vec 和一个改变数字的位置。

在 JavaScript 中,这非常简单:

function replaceNumber(line, position, number) {
return [
...line.slice(0, position),
number,
...line.slice(position+1, line.length)
]
}

如何在 Rust 中实现类似的功能?

我试过这个:

fn replace_number(line: Vec<i32>, point: i32, number: i32) -> Vec<i32> {
return [
&line[0..point as usize],
&[number],
&line[point as usize+1, point.len()]
].concat();
}

结果是一个数组数组。我怎样才能像 JavaScript 示例那样进行解构?

最佳答案

I want to make a function that receives a Vec and a position to change a number.

Rust 有索引语法,就像 JavaScript 一样,所以真的不需要解构。

fn replace_number(mut line: Vec<i32>, point: usize, number: i32) -> Vec<i32> {
line[point] = number;
line
}

或者更通俗地说:

fn replace_number(line: &mut Vec<i32>, point: usize, number: i32) {
line[point] = number
}

更惯用的做法是不要这个函数,可能,只是将它写成内联...

I want to know about immutably adding

使用您的原始代码,对于因可变性而发生的任何“坏”事情,您都担心:

fn replace_number(line: Vec<i32>, point: i32, number: i32) -> Vec<i32>

此函数拥有 Vec 的所有权,因此不变性的概念在这里相当没有实际意义——调用者不再拥有 Vec 来关心它是否发生了变化!

如果你想共享数据,你会使用像 &[i32] 这样的引用(特别是 slice)。这本质上是不可变的——如果你愿意,你不能改变它。您必须克隆所有子项并使向量可变:

fn replace_number(line: &[i32], point: usize, number: i32) -> Vec<i32> {
let mut line = line.to_owned();
line[point] = number;
line
}

如果您真的想要类似 JS 语法的东西,您可以使用 concat :

fn replace_number(line: &[i32], point: usize, number: i32) -> Vec<i32> {
[&line[..point], &[number], &line[point + 1..]].concat()
}

另见:

关于functional-programming - 如何像JavaScript的解构一样加入数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51748322/

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