【发布时间】:2020-12-13 20:41:09
【问题描述】:
假设我想对 non-Clone 项的 Vec 进行排序 - 但只是可能(这是我代码中问题的简化示例)。
我的尝试是这样的:
fn maybe_sort<T>(x: Vec<T>) -> Vec<T>
where
T: std::cmp::Ord,
{
// First, I need a copy of the vector - but only the vector, not the items inside
let mut copied = x.iter().collect::<Vec<_>>();
copied.sort();
// In my actual code the line below depends on the sorted vec
if rand::random() {
return copied.into_iter().map(|x| *x).collect::<Vec<_>>();
} else {
return x;
}
}
唉,借阅检查员不高兴。我对 Vec 中的每个项目都有一个共享引用,虽然我从来没有返回对同一个项目的 2 个引用,但 Rust 无法判断。
没有unsafe 有没有办法做到这一点? (如果没有,使用unsafe 最干净的方法是什么。
【问题讨论】:
-
“只有向量,而不是里面的项目”是什么意思?此外,对向量进行排序不需要复制它。无论如何,你可以对向量做任何你想做的事情,因为你是按值传递和返回它。
-
为什么不对
x进行排序? playground link -
我在硬币翻转线上方添加了一条评论,希望能更清楚地说明 - 我需要先排序,然后再决定是否退货。
-
@Acorn “只有向量,而不是里面的项目”——我的意思是我不能克隆里面的项目。这些项目不可复制。
-
@xixixao 你有什么理由不能
Clone? (例如,您的类型真的那么“大”吗?)。可以做你想做的事,我目前正在写一个答案,但它需要对Vec进行双重排序。
标签: rust borrow-checker