2016-10-21 15 views
9

này chương trình đơn giản:Tại sao `Box :: into_raw` không tự tham số?

fn main() { 
    let b: Box<i32> = Box::new(1); 
    b.into_raw(); 
} 

Tạo lỗi bất tiện này khi biên soạn với Rust 1.12.0:

error: no method named `into_raw` found for type `Box<i32>` in the current scope 
--> <anon>:3:7 
    | 
3 |  b.into_raw(); 
    |  ^^^^^^^^ 
    | 
    = note: found the following associated functions; to be used as methods, functions must have a `self` parameter 
    = note: candidate #1 is defined in an impl for the type `Box<_>` 

Điều này là do into_raw không được định nghĩa để chăm self như tham số, nhưng thay vào đó được định nghĩa là :

impl Box<T: ?Sized> { 
    fn into_raw(b: Box<T>) -> *mut T; 
} 

Điều này có vẻ bất tiện và tôi không thể tìm được lý do.

Vậy ... tại sao?

Trả lời

9

Vì 99.995% thời gian (thống kê hoàn toàn được tạo thành), you expect method calls to happen to the thing being pointed to, not to the pointer itself. Do đó, các loại "con trỏ thông minh" trong Rust thường là tránh làm bất cứ điều gì để phá vỡ kỳ vọng đó. Một ngoại lệ rõ ràng sẽ là một cái gì đó như Rc/Arc thực hiện trực tiếp Clone.

+0

Ah cảm ơn! Tôi đã phá hủy bộ não của mình theo một hướng hoàn toàn sai lầm và đã không nghĩ rằng hầu hết các cuộc gọi phương thức được chuyển tiếp đến con trỏ thông qua 'Defer'. –

7

Box thực hiện Deref, có nghĩa là tất cả các phương pháp được đính kèm theo Box sẽ tự động được cung cấp; từ bên ngoài, Box<T>T xem và hành động giống nhau.

Nếu into_raw là phương pháp thay vì hàm liên quan, nó sẽ làm mờ bất kỳ phương thức into_raw nào trên loại được chứa.

Có những ví dụ khác của các chức năng liên quan tăng cường trên Rc như downgrade hoặc try_unwrap, hoặc trên Arc, chẳng hạn như make_mut.

+2

Xem [yêu cầu kéo] (https://github.com/rust-lang/rust/pull/21318) thêm các chức năng này vào thư viện chuẩn. – thirtythreeforty

+0

@thirtythreeforty: Một nguồn tuyệt vời thực sự, bình luận của alexcrichton giải thích nó chính xác. –

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