Types 预期类型`&;Vec<;u8>;`,找到`&;Vec<&;u8>`

Types 预期类型`&;Vec<;u8>;`,找到`&;Vec<&;u8>`,types,rust,Types,Rust,我有这个小片段,但它没有编译,所有的错误都源于返回&Vec而不是&Vec 因此,它实际上应该是一个Vec作为一个专业程序员,你应该学会生成一个。以下是解决您问题的方法: extern crate itertools; use itertools::Itertools; const RANKS: [u8; 13] = [12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]; fn main() { let one_combination: () = RAN

我有这个小片段,但它没有编译,所有的错误都源于返回
&Vec
而不是
&Vec


因此,它实际上应该是一个
Vec

作为一个专业程序员,你应该学会生成一个。以下是解决您问题的方法:

extern crate itertools;
use itertools::Itertools;

const RANKS: [u8; 13] = [12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0];

fn main() {
    let one_combination: () = RANKS.iter().combinations_n(5).next();
}
失败,并出现相关错误:

错误:不匹配的类型[E0308]
让一个组合:()=RANKS.iter().compositions_n(5.next();
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
帮助:运行'rustc--explain E0308'查看详细说明
注意:应为类型“()`
注意:找到类型“std::option::option”`
这表明这种对
组合的特殊调用确实产生了
Vec
,而不是
Vec

那为什么呢

这一行来自组合SN的定义是关键:

type Item = Vec<I::Item>
因此,通过迭代一个切片,您可以得到对切片元素的引用,然后引用本身被传递到
CombinationsN
,然后它克隆引用并将其收集到
Vec

一种解决方案是克隆迭代的元素:

RANKS.iter().cloned().combinations_n(5)

谢谢实际上,我删除了很多代码,我认为这是一个足够小的示例。我以后会更留心的。也谢谢你的详细解释。@rubik不用担心!我只是想指出可以创建的较小版本,因为通常还有几个步骤来精简示例。至少你的问题包含了足够的信息来重现问题^_^
type Item = Vec<I::Item>
type Item = &'a T
RANKS.iter().cloned().combinations_n(5)