2016-03-16 33 views
2

如何从可变的向量中克隆最后一个元素,然后将值推送到Rust中的向量?如何克隆可变向量中的最后一个元素,然后将值推送到Rust中的向量?

fn ElementsFromPoint(&self, ...) -> Vec<Root<Element>> { 

    let mut elements: Vec<Root<Element>> = self.elements_from_point(point).iter() 
     .map(|&untrusted_node_addr| {...}).collect();  

    let last_element = elements.last().clone().unwrap(); // elements.last() is Option<&Root<Element>> 
    if let Some(root_element) = self.GetDocumentElement() { //self.GetDocumentElement() is Option<Root<Element>> 
     if *last_element != root_element { 
      elements.push(root_element); 
     } 
    } 


    elements 
} 

的错误是

2620:17: 2620:25 error: cannot borrow `elements` as mutable because it is also borrowed as immutable [E0502] 
2620     elements.push(root_element); 
        ^~~~~~~~ 
2617:28: 2617:36 note: previous borrow of `elements` occurs here; the immutable borrow prevents subsequent moves or mutable borrows of `elements` until the borrow ends 
2617   let last_element = elements.last().clone().unwrap(); 
           ^~~~~~~~ 
2626:6: 2626:6 note: previous borrow ends here 
2590  fn ElementsFromPoint(&self, x: Finite<f64>, y: Finite<f64>) -> Vec<Root<Element>> { 
                 ... 
2626  } 
                  ^
2625:9: 2625:17 error: cannot move out of `elements` because it is borrowed [E0505] 
2625   elements 
      ^~~~~~~~ 
2617:28: 2617:36 note: borrow of `elements` occurs here 
2617   let last_element = elements.last().clone().unwrap(); 

我读过this并试图

let last_element = elements.last().unwrap().clone(); 

let last_element = elements.last().map(|t| t.clone()).unwrap(); 

,但还是失败了。

还有.cloned()还没有为Root<T>执行。

有没有办法克隆可变的向量中的最后一个元素,然后将值推送到Rust中的向量?或者我应该首先实施Cloned特质?

回答

3

试试这个

fn ElementsFromPoint(&self, ...) -> Vec<Root<Element>> { 

    let mut elements: Vec<Root<Element>> = self.elements_from_point(point).iter() 
     .map(|&untrusted_node_addr| {...}).collect(); 


    if let Some(root_element) = self.GetDocumentElement() { 
     if { 
      match elements.last() { 
       Some(last_element) => *last_element != root_element, 
       None => true 
      }     
     } { 
      elements.push(root_element); 
     } 
    } 

    elements 
} 
+0

酷,'if'块完美的作品!谢谢! – rilut

+1

在'if'条件下块的好技巧。实际上'clone()'在这里什么都不做,''''''''''是空的时''unwrap()'可能导致恐慌。我会推荐使用: 'if elements.last()。map(| x | * x!= root_element).unwrap_or(true){elements.push(root_element)}' – aSpex

+0

@aSpex我刚从问题中复制代码,改变或opimisations,但你是绝对正确的。 – qthree

相关问题