Мне сложно преобразовать свой автономный merge_sort
функция в признаке для Vec<T>
. Кажется, я сталкиваюсь с жизненными ошибками с тем, как работает алгоритм сортировки слияния.Проблемы с временами жизни на функции рекурсивных признаков
Я попытался указать время жизни в объявлениях функций и признаков, но это все равно дает мне аналогичную ошибку.
Мои исследования по жизни включает в себя ...
- Эффективная Rust
- Книга Rust
- Несколько видео YouTube на жизни
- Большинство вопросов на переполнение стека относительно жизни
Вот код
trait MergeSortable<T> {
fn merge_sort(&mut self);
fn _merge(&self, left: &mut Vec<T>, right: &mut Vec<T>) -> &mut Vec<T>;
}
impl<T: Ord + Clone + PartialEq> MergeSortable<T> for Vec<T> {
fn merge_sort(&mut self) {
if self.len() <= 1 {
return;
}
let mid = self.len()/2;
let mut left = self[..mid].to_vec();
left.merge_sort();
let mut right = self[mid..].to_vec();
right.merge_sort();
self = self._merge(&mut left, &mut right);
}
fn _merge(&self, left: &mut Vec<T>, right: &mut Vec<T>) -> &mut Vec<T> {
if left.len() == 0 {
return right;
}
if right.len() == 0 {
return left;
}
if left[0] < right[0] {
let mut v: Vec<T> = Vec::new();
v.push(left[0].clone());
v.extend_from_slice(&self._merge(&mut left[1..].to_vec().clone(), &mut right.clone())[..]);
return &mut v;
}
let mut v: Vec<T> = Vec::new();
v.push(right[0].clone());
v.extend_from_slice(&self._merge(&mut left.clone(), &mut right[1..].to_vec().clone())[..]);
return &mut v;
}
}
И ошибки:
error: lifetime of reference outlives lifetime of borrowed content... [E0312]
--> <anon>:27:20
|>
27 |> return left;
|> ^^^^
note: ...the reference is valid for the anonymous lifetime #1 defined on the block at 22:75...
--> <anon>:22:76
|>
22 |> fn _merge(&self, left: &mut Vec<T>, right: &mut Vec<T>) -> &mut Vec<T> {
|> ^
note: ...but the borrowed content is only valid for the anonymous lifetime #2 defined on the block at 22:75
--> <anon>:22:76
|>
22 |> fn _merge(&self, left: &mut Vec<T>, right: &mut Vec<T>) -> &mut Vec<T> {
|> ^
error: lifetime of reference outlives lifetime of borrowed content... [E0312]
--> <anon>:24:20
|>
24 |> return right;
|> ^^^^^
note: ...the reference is valid for the anonymous lifetime #1 defined on the block at 22:75...
--> <anon>:22:76
|>
22 |> fn _merge(&self, left: &mut Vec<T>, right: &mut Vec<T>) -> &mut Vec<T> {
|> ^
note: ...but the borrowed content is only valid for the anonymous lifetime #3 defined on the block at 22:75
--> <anon>:22:76
|>
22 |> fn _merge(&self, left: &mut Vec<T>, right: &mut Vec<T>) -> &mut Vec<T> {
|> ^
help: consider using an explicit lifetime parameter as shown: fn _merge<'a, 'b>(&'a self, left: &'a mut Vec<T>, right: &'b mut Vec<T>)
-> &mut Vec<T>
--> <anon>:22:5
|>
22 |> fn _merge(&self, left: &mut Vec<T>, right: &mut Vec<T>) -> &mut Vec<T> {
|> ^
@Shepmaster: Код имеет много проблем, и это всего лишь один из них ... –
Ответы могут также быть заинтересованы в [предоставлении OP обзора кода этого и других алгоритмов сортировки] (http: //codereview.stackexchange .com/д/141605/32521). – Shepmaster
@электрометр, который был направлен больше на меня, чем на тебя^_ ^. Я имею тенденцию иметь тяжелую руку с обозначением вопросов как дубликатов; это способ сказать мне, что такой дубликат не будет полезен. – Shepmaster