Việc thực hiện std::mem::drop
được ghi lại như sau:
pub fn drop<T>(_x: T) { }
Như vậy, tôi hy vọng việc đóng cửa |_| ()
(thông thường được gọi là đóng cửa nhà vệ sinh ) sẽ là sự thay thế tiềm năng 1: 1 cho drop
cả hai hướng. Tuy nhiên, mã dưới đây cho thấy drop
không tương thích với một đặc điểm được xếp hạng cao hơn ràng buộc vào tham số của chức năng, trong khi đóng cửa nhà vệ sinh là.
fn foo<F, T>(f: F, x: T)
where
for<'a> F: FnOnce(&'a T),
{
dbg!(f(&x));
}
fn main() {
foo(|_| (), "toilet closure"); // this compiles
foo(drop, "drop"); // this does not!
}
Thông báo lỗi của trình biên dịch:
error[E0631]: type mismatch in function arguments
--> src/main.rs:10:5
|
1 | fn foo<F, T>(f: F, x: T)
| ---
2 | where
3 | for<'a> F: FnOnce(&'a T),
| ------------- required by this bound in `foo`
...
10 | foo(drop, "drop"); // this does not!
| ^^^
| |
| expected signature of `for<'a> fn(&'a _) -> _`
| found signature of `fn(_) -> _`
error[E0271]: type mismatch resolving `for<'a> <fn(_) {std::mem::drop::<_>} as std::ops::FnOnce<(&'a _,)>>::Output == ()`
--> src/main.rs:10:5
|
1 | fn foo<F, T>(f: F, x: T)
| ---
2 | where
3 | for<'a> F: FnOnce(&'a T),
| ------------- required by this bound in `foo`
...
10 | foo(drop, "drop"); // this does not!
| ^^^ expected bound lifetime parameter 'a, found concrete lifetime
Xem xét drop
được cho là chung chung đối với bất kỳ kích thước nào T
, có vẻ không hợp lý khi chữ ký "chung chung hơn" fn(_) -> _
không tương thích for<'a> fn (&'a _) -> _
. Tại sao trình biên dịch không thừa nhận chữ ký drop
ở đây, và điều gì làm cho nó khác biệt khi đóng cửa nhà vệ sinh được đặt thay cho nó?