我想创建一个接收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示例那样进行破坏?
答案 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()
}
另请参阅: