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ứciter
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()
và 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();
}
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