如何像JavaScript的解构那样连接数组?
How to join arrays like JavaScript's destructuring?
我想做一个函数接收一个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
使用您的原始代码,零 担心由于可变性而发生的任何事情 "bad":
fn replace_number(line: Vec<i32>, point: i32, number: i32) -> Vec<i32>
此函数拥有 Vec
的所有权,因此不变性的概念在这里没有实际意义 — 调用者不再需要 Vec
来关心它是否发生了变化!
如果您想共享数据,您可以使用参考(切片,特别是 &[i32]
。这本质上是不可变的——如果你愿意,你不能改变它。您必须克隆所有子项并使向量可变:
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()
}
另请参阅:
我想做一个函数接收一个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
使用您的原始代码,零 担心由于可变性而发生的任何事情 "bad":
fn replace_number(line: Vec<i32>, point: i32, number: i32) -> Vec<i32>
此函数拥有 Vec
的所有权,因此不变性的概念在这里没有实际意义 — 调用者不再需要 Vec
来关心它是否发生了变化!
如果您想共享数据,您可以使用参考(切片,特别是 &[i32]
。这本质上是不可变的——如果你愿意,你不能改变它。您必须克隆所有子项并使向量可变:
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()
}
另请参阅: