2016-05-27 16 views
9

Tôi đã xem qua tài liệu và cho đến nay tôi chưa thấy chức năng được tích hợp để di chuyển an toàn một mục ra khỏi Vec.Được xây dựng trong * cách an toàn * để di chuyển ra khỏi Vec <T>?

Vec::get tồn tại, nhưng điều đó chỉ mượn. Vec::remove tồn tại, và trong khi đó di chuyển ra khỏi vectơ, nó cũng hoảng loạn nếu chỉ mục nằm ngoài phạm vi. Vì vậy, tôi có hai câu hỏi:

  1. Cách dự định/tốt để di chuyển một mục từ một véc tơ là gì?
  2. remove(&mut self, index: usize) -> T panics nếu nằm ngoài phạm vi phủ sóng. Điều gì có thể là lý do để hoảng sợ? Tại sao nó không được triển khai như remove(&mut self, index: usize) -> Option<T>?
+0

Hy vọng câu hỏi này không phải là quá đầu cơ .. Tôi đang tìm kiếm sự hiểu biết, không cố gắng suy đoán. – FizzBazer

+2

Theo kinh nghiệm của tôi, hiếm khi có chỉ số vào một véc tơ mà bạn không biết liệu chúng có hợp lệ hay không. Panicking phù hợp với trường hợp phổ biến đó, nơi một chỉ mục không hợp lệ đại diện cho một lỗi. Đối với trường hợp không phổ biến, bạn chỉ cần xác thực chỉ mục trước khi sử dụng nó. – CodesInChaos

Trả lời

6

Nếu bạn nói safe trong bối cảnh Rust, chúng tôi nghĩ về an toàn bộ nhớ. .remove(i) chắc chắn là an toàn trong các điều khoản Rust thông thường, chỉ để làm rõ. Gọi số panic!()an toàn.

Các lỗi hành vi của .remove(i).swap_remove(i) là tương tự như đối lập chỉ mục một vector với v[i] cú pháp: Nếu i là ngoài giới hạn, đó là một lỗi lập trình viên và các chức năng thư viện hoảng loạn. Điều này còn được gọi là điều khoản vi phạm hợp đồng trong hướng dẫn xử lý lỗi.

Vì vậy, suy nghĩ đằng sau thư viện là bạn chỉ sử dụng v[i] hoặc v.remove(i) nếu bạn biết rằng i là trong giới hạn, và bạn thực sự có thể kiểm tra xem nó đang sử dụng i < v.len() hoặc v.get(i) nếu bạn muốn.

Có một chức năng khác cho phép bạn di chuyển một phần tử ra khỏi vec-tơ mà không có khả năng hoảng sợ và đó là v.pop() loại bỏ mục cuối cùng trong vectơ, trả về Option<T> cho số Vec<T>.

+1

Đó là một điểm tốt về an toàn. Xin lỗi vì sử dụng thuật ngữ không chính xác. Như đã nói, có sự khác biệt có ý nghĩa giữa 'v.get' và' v.remove' liên quan đến hành vi của họ không? – FizzBazer

+2

'get' tồn tại để có một cách trả về tùy chọn để lập chỉ mục. (Cơ sở lập chỉ mục chính là 'v [i]'). Không có phiên bản trả về 'remove'. – bluss

1

Ngoài ra còn có vec::drain sẽ cung cấp cho bạn trình lặp trên một loạt các giá trị đã bị xóa. Bây giờ tôi nhìn vào nó mặc dù, phương pháp này cũng sẽ hoảng loạn trên out-of-bounds truy cập ...

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