私のスタンドアロンのmerge_sort
関数をVec<T>
の特性に変換するのは苦労しています。私は、マージソートアルゴリズムが動作する方法で生涯エラーに遭遇しているようです。再帰的形質機能の寿命に関する問題
私は関数と特性宣言で寿命を指定しようとしましたが、それでも私には同様のエラーが出ています。 が寿命に私の研究が含まれ
...
- 効果的な錆
- 錆帳 寿命に
- いくつかの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:コードには多くの問題がありますが、これはそのうちの1つに過ぎません。 –
[OPにこのアルゴリズムと他のソートアルゴリズムのコードレビューを提供しています](http://codereview.stackexchange .com/q/141605/32521)。 – Shepmaster
@electrometroそれはあなたよりも私をより重視していました^ _ ^。私は重複して質問に印を付けて重い手を持つ傾向があります。そのような重複が役に立たないと私に伝える方法でした。 – Shepmaster