【发布时间】:2020-01-21 08:11:52
【问题描述】:
我有以下代码-sn-ps(不要质疑它们的意义;))
1.递归获取 Vec 的第 n 个元素
fn helper<T: Clone>(n: usize, current_n: usize, current_xs: &Vec<T>, accumulator: Option<T>) -> Option<T> {
if current_n > n {
accumulator
} else {
let head = current_xs.get(0).cloned();
let tail = current_xs.clone().into_iter().skip(1).collect();
return helper(n, current_n + 1, &tail, head);
}
}
2。递归获取 Vec 的长度
fn helper<T: Clone>(current_xs: &Vec<T>, accumulator: usize) -> usize {
if current_xs.is_empty() {
accumulator
} else {
let tail = current_xs.clone().into_iter().skip(1).collect();
return helper(tail, accumulator + 1)
}
}
我的问题是关于那一行:
let tail = current_xs.clone().into_iter().skip(1).collect();
在第一个示例中,tail 变量的类型为 Vec<T>,而在第二个示例中,tail 变量的类型为 &Vec<?>。
问题:
- 为什么?为什么返回两种不同类型的确切代码行?
- 如何在第二个示例中返回
Vec<T>?
【问题讨论】:
-
旁注:我知道您只是将其作为练习,但请注意(以及对于未来的读者)仍然有用的是,将切片作为参数而不是不可变的更惯用引用
Vec -
是什么让你觉得这两个变量有不同的类型?第二个示例根本无法编译,可以通过在对
helper()的调用中将tail更改为&tail来修复。 -
@justinas 大声笑...你是对的,当我在 IntelliJ 中修改对
return helper(&tail, accumulator + 1)的帮助程序调用时,尾部的“类型”更改为Vec<T>。但是我还是不明白,为什么let tail ...之后的那一行对let tail...那一行有影响 -
@SvenMarnach IntelliJ 说。它以某种方式解析类型。
-
@SleepyX667 你能用一个最小的例子创建一个Playground link,这样每个人都在同一个页面上并观察你所做的同样的事情