如何加入像JavaScript的解构这样的数组?

Ren*_*ino 1 functional-programming concat rust

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

在JavaScript中,这非常简单:

function replaceNumber(line, position, number) {
  return [
    ...line.slice(0, position),
    number,
    ...line.slice(position+1, line.length)
  ]
}
Run Code Online (Sandbox Code Playgroud)

如何在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();
}
Run Code Online (Sandbox Code Playgroud)

结果是一个数组数组.如何像JavaScript示例一样进行解构?

She*_*ter 6

我想创建一个接收Vec的函数和一个更改数字的位置.

Rust有索引语法,就像JavaScript一样,因此实际上不需要进行解构.

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

或者,更具有惯用力:

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

更具有惯用力的可能就是没有这个功能,只需将其写入内联...

我想知道不可改变的添加

有了您的原代码,还有任何东西的"坏",因为可变性的发生关注:

fn replace_number(line: Vec<i32>, point: i32, number: i32) -> Vec<i32>
Run Code Online (Sandbox Code Playgroud)

这个函数取得了所有权Vec,因此不变性的概念在这里没有实际意义 - 调用者不再Vec需要关心它是否发生变异!

如果你想共享数据,你可以使用一个引用(特别是一个切片)&[i32].这本质上是不可改变的 - 如果你愿意,你不能改变它.您必须克隆所有子项并使向量变为可变:

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

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

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

也可以看看:

  • @RenatoCassino这不是一个容易回答的问题.你在JS中避免可变性的原因是什么?你知道*为什么*可变性导致问题?Rust以不同的方式解决了许多(但不是全部)问题. (2认同)