2015-08-26 26 views
6

Tôi đang đọc số Rust 101 tutorial, nơi tác giả nói về khoản vay được chia sẻ với ví dụ về đối tượng Vec được chuyển đến một hàm. Dưới đây là một MWE được điều chỉnh một chút về hướng dẫn giảng dạy. Phần thú vị là v.iter() trong vec_min. Tác giả viết:Sự khác nhau giữa iter() và in_iter() trên một Vec được chia sẻ, mượn?

Lần này, chúng tôi yêu cầu một trình lặp cho vector v một cách rõ ràng. Phương thức iter mượn vectơ mà nó hoạt động và cung cấp các khoản vay được chia sẻ của các phần tử.

Nhưng điều gì sẽ xảy ra nếu tôi sử dụng công trình for ... in ... xây dựng trên một đối tượng được chia sẻ? Theo số this blog post, ngầm định này cho vòng lặp sử dụng into_iter(), chiếm quyền sở hữu v. Nhưng nó không thể thực sự nắm quyền sở hữu của v trong chức năng đó, vì nó chỉ mượn nó để bắt đầu, phải không?

Ai đó có thể giải thích sự khác biệt giữa into_iter()iter() áp dụng cho đối tượng được mượn cho tôi?

enum NumberOrNothing { 
    Number(i32), 
    Nothing, 
} 
use self::NumberOrNothing::{Number,Nothing}; 

impl NumberOrNothing { 
    fn print(self) { 
     match self { 
      Nothing => println!("The number is: <nothing>"), 
      Number(n) => println!("The number is: {}", n), 
     }; 
    } 
} 

fn vec_min(v: &Vec<i32>) -> NumberOrNothing { 
    fn min_i32(a: i32, b: i32) -> i32 { 
     if a < b {a} else {b} 
    } 

    let mut min = Nothing; 
    for e in v.iter() { 
    //Alternatively implicitly and with *e replaced by e: 
    //for e in v { 
     min = Number(match min { 
      Nothing => *e, 
      Number(n) => min_i32(n, *e), 
     }); 
    } 
    min 
} 

pub fn main() { 
    let vec = vec![18,5,7,2,9,27]; 
    let foo = Nothing; 
    let min = vec_min(&vec); 
    let min = vec_min(&vec); 
    min.print(); 
} 

Trả lời

9

Nhưng nó có thể không thực sự mất quyền sở hữu của v trong chức năng đó, vì nó đã chỉ mượn nó để bắt đầu với

Nó hoàn toàn thể mất quyền sở hữu của v, bởi vì đó là một &Vec. Lưu ý ngữ nghĩa chính xác ở đây - bạn đang sở hữu của tham chiếu, không phải của mục được đề cập đến.

Nếu bạn kiểm tra implementors of IntoIterator, bạn có thể tìm thấy:

impl<'a, T> IntoIterator for &'a Vec<T> 

source for that:

impl<'a, T> IntoIterator for &'a Vec<T> { 
    fn into_iter(self) -> slice::Iter<'a, T> { 
     self.iter() 
    } 
} 

Surprise - nó gọi iter! Vì vậy, câu trả lời cho câu hỏi của bạn là: không có sự khác biệt.

+3

Phải, điều này thật tuyệt, cảm ơn rất nhiều! Tôi cũng đã nhầm lẫn về 'in_iter()' có thể làm việc trên cả '& Vec' và' Vec', nhưng nguồn mà bạn tham chiếu giải thích nó: có một người triển khai cho 'Vec ' cũng như cho '& 'một Vec ' và '& 'a mut Vec '. Những thứ rất tuyệt! :) – mSSM

Các vấn đề liên quan