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

时间:2018-08-08 13:44:54

标签: functional-programming rust concat

我想创建一个接收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示例那样进行破坏?

1 个答案:

答案 0 :(得分:6)

  

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

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
}

更惯用的是可能没有此功能,而是直接内联编写...

  

我想了解一成不变的添加

在您的原始代码中,由于可变性而发生的任何“不良”事件为零

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()
}

另请参阅: