Rust 为什么不';t标准库在元组数组上实现collect';没有克隆()的迭代器?

Rust 为什么不';t标准库在元组数组上实现collect';没有克隆()的迭代器?,rust,Rust,此代码适用于: use std::collections::HashMap; fn main() { let result: HashMap<&str, &str> = [("name", "Luke")].iter().cloned().collect(); println!("{:?}", &result); } 我的理解是,标准库为元组实现了很多东西,但不是这种情况?为什么不这样编译呢?完整的错误消息包含更多有用的信息: error

此代码适用于:

use std::collections::HashMap;

fn main() {
    let result: HashMap<&str, &str> = [("name", "Luke")].iter().cloned().collect();

    println!("{:?}", &result);
}

我的理解是,标准库为元组实现了很多东西,但不是这种情况?为什么不这样编译呢?

完整的错误消息包含更多有用的信息:

error[E0277]:特性绑定的'std::collections::HashMap:std::iter::fromtiterator'不满足
-->src/main.rs:4:65
|
4 | let result:HashMap=[(“name”,“Luke”)].iter().collect();
|^^^^^^无法从`&(&str,&str)类型元素上的迭代器生成类型为`std::collections::HashMap`的集合`
|
=帮助:“std::collections::HashMap”未实现特性“std::iter::FromIterator”`
不带
.cloned()
的代码正在尝试从元组引用的迭代器生成
HashMap
,但该方法需要拥有元组的迭代器。调用
.cloned()
将引用的迭代器转换为拥有元组的迭代器,可以从iter()调用
HashMap::from
(这就是
.collect()
将调用的内容)


标准库没有为元组引用的迭代器实现
HashMap::from_iter()
,原因是
HashMap
需要拥有元组才能从元组中获取键和值,如果向元组传递引用,这是不可能的

完整的错误消息包含更多有用的信息:

error[E0277]:特性绑定的'std::collections::HashMap:std::iter::fromtiterator'不满足
-->src/main.rs:4:65
|
4 | let result:HashMap=[(“name”,“Luke”)].iter().collect();
|^^^^^^无法从`&(&str,&str)类型元素上的迭代器生成类型为`std::collections::HashMap`的集合`
|
=帮助:“std::collections::HashMap”未实现特性“std::iter::FromIterator”`
不带
.cloned()
的代码正在尝试从元组引用的迭代器生成
HashMap
,但该方法需要拥有元组的迭代器。调用
.cloned()
将引用的迭代器转换为拥有元组的迭代器,可以从iter()调用
HashMap::from
(这就是
.collect()
将调用的内容)


标准库没有为元组引用的迭代器实现
HashMap::from_iter()
,原因是
HashMap
需要拥有元组才能从元组中获取键和值,如果向元组传递引用,这是不可能的

你能回答OP的问题吗?为什么标准库没有实现元组引用的
FromIter
?非常感谢。为什么它不能使用ref元组的值呢?这是可行的:
let tup=&(&1,&2);普林顿!(“{:?}”,tup.0)
@YuriGeinish,唯一有效的原因是整数实现了
Copy
特性,因此可以从引用中复制它们。如果您尝试使用诸如
String
之类的其他内容,您会得到一个错误,您是对的。正如它所说,它将从借来的内容中移出。
HashMap
不能通过借用元组的值来解决这个问题吗?@YuriGeinish:不。你不会告诉
HashMap
如何存储键和值,它可以将它们存储在元组数组中,或者它可以使用一个数组作为键,一个数组作为值。如果它所拥有的只是对元组的引用,那么它将如何区分键和值呢?这将需要克隆,而明确性方面的错误在于使克隆对客户端可见。您能否回答OP的问题,即标准库为什么不为元组引用实现
FromIter
?非常感谢。为什么它不能使用ref元组的值呢?这是可行的:
let tup=&(&1,&2);普林顿!(“{:?}”,tup.0)
@YuriGeinish,唯一有效的原因是整数实现了
Copy
特性,因此可以从引用中复制它们。如果您尝试使用诸如
String
之类的其他内容,您会得到一个错误,您是对的。正如它所说,它将从借来的内容中移出。
HashMap
不能通过借用元组的值来解决这个问题吗?@YuriGeinish:不。你不会告诉
HashMap
如何存储键和值,它可以将它们存储在元组数组中,或者它可以使用一个数组作为键,一个数组作为值。如果它所拥有的只是对元组的引用,那么它将如何区分键和值呢?这就需要克隆,而关于明确性的错误在于使克隆对客户可见。