【发布时间】:2023-01-09 07:59:54
【问题描述】:
我正在尝试利用函数式编程和递归在 Rust 中创建用户输入验证函数。如何返回一个不可变向量,其中一个元素连接到末尾?
fn get_user_input(output_vec: Vec<String>) -> Vec<String> {
// Some code that has two variables: repeat(bool) and new_element(String)
if !repeat {
return output_vec.add_to_end(new_element); // What function could "add_to_end" be?
}
get_user_input(output_vec.add_to_end(new_element)) // What function could "add_to_end" be?
}
其他所有功能都有:push 将可变向量添加到可变向量append 将一个元素添加到可变向量的末尾concat 将不可变向量添加到不可变向量??? 将一个元素添加到不可变向量的末尾
我能够开始工作的唯一解决方案是使用:
[write_data, vec![new_element]].concat()
但这似乎效率低下,因为我只为一个元素制作了一个新向量(因此大小在编译时已知)。
【问题讨论】:
-
你为什么不能直接带
mut output_vec: Vec<String>?你可能的原因是什么不能可变地取值? (或者output_vec应该是一个参考?) -
我可以让它可变,但我想要一种遵循函数式编程原则的方法。
-
add_to_end应该返回一个新的Vec吗?看起来它实际上是let mut result = output_vec.clone(); result.push(new_element) -
@Alex 您已经在尝试在您的示例代码中使用
Vec::push()的等价物,这不是纯粹的功能。你会发现纯函数式方法由于其借用系统而在 Rust 中效果不佳。此外,请注意,与 JavaScript 或 Java 等语言不同,在这些语言中您实际上从未拥有一个对象(相反,您始终拥有一个引用),在 Rust 中您可以拥有一个对象本身,这就是output_vec。你不必担心不改变不属于你的对象,因为output_vec确实属于这个功能因为它是按价值计算的。 -
是的,我在质疑约束背后的原因,因为我认为这不是一个有用的约束,并且掩盖了对 Rust 中所有权的误解。
标签: recursion vector rust functional-programming immutability