问题简化如下:
use itertools::Itertools; // 0.10.1
fn main() {
[""].iter().map(|s| (s.to_lowercase(), 1))
.into_grouping_map_by(|s| s.0);
}
获得编译错误:
error[E0507]: cannot move out of `s.0` which is behind a shared reference
--> src/main.rs:5:35
|
5 | .into_grouping_map_by(|s| s.0);
| ^^^ move occurs because `s.0` has type `String`, which does not implement the `Copy` trait
For more information about this error, try `rustc --explain E0507`.
error: could not compile `playground` due to previous error
在这种情况下,clone 是一个简单粗暴的选择;但由于数据量较大,会增加一倍左右的耗时。
我希望能避免 clone 的开销,要怎么做?
1
共 7 条评论, 1 页
评论区
写评论问题解决了,感谢解答!
--
👇
苦瓜小仔: 我不知道你真实的意图是什么,但是如果需要计数或者基于位置进行计算,你可以这么写
我不知道你真实的意图是什么,但是如果需要计数或者基于位置进行计算,你可以这么写:
--
👇
hzqd: 你曲解了
into_grouping_map_by
的含义,这个是用来分组的,不是用来映射的。必须先映射,再分组。
--
👇
苦瓜小仔: 仅对此例:
你曲解了
into_grouping_map_by
的含义,这个是用来分组的,不是用来映射的。必须先映射,再分组。
--
👇
苦瓜小仔: 仅对此例:
&str
可以通过编译。这里不能通过编译是因为to_lowercase
返回了String
,而into_grouping_map_by
会把元组带个引用,于是String
就变成了共享引用,无法move
--
👇
gwy15: 你看它源代码就知道 https://docs.rs/itertools/0.10.1/src/itertools/grouping_map.rs.html#27
这里是直接进行一个
(self.1)(&val), val)
,self.1
是FnMut(&V) -> K
,那这里就不可能用&str
,因为这两个都需要有所有权。那要避免克隆就必须对你的所有权进行改造,比如用
Arc<str>
或者Rc<str>
替换String
。仅对此例:
你看它源代码就知道 https://docs.rs/itertools/0.10.1/src/itertools/grouping_map.rs.html#27
这里是直接进行一个
(self.1)(&val), val)
,self.1
是FnMut(&V) -> K
,那这里就不可能用&str
,因为这两个都需要有所有权。那要避免克隆就必须对你的所有权进行改造,比如用
Arc<str>
或者Rc<str>
替换String
。iter 换成into_iter