การใช้งานของstd::mem::drop
เอกสารจะเป็นดังต่อไปนี้:
pub fn drop<T>(_x: T) { }
ดังนั้นฉันจึงคาดหวังว่าการปิด|_| ()
(หรือที่รู้จักกันในชื่อการปิดห้องน้ำ ) จะเป็น 1: 1 ที่มีศักยภาพในการทดแทนdrop
ทั้งสองทิศทาง อย่างไรก็ตามรหัสด้านล่างแสดงให้เห็นว่าdrop
ไม่เข้ากันกับลักษณะการจัดอันดับที่สูงกว่าที่ถูกผูกไว้กับพารามิเตอร์ของฟังก์ชั่นในขณะที่การปิดห้องน้ำเป็น
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!
}
ข้อความแสดงข้อผิดพลาดของคอมไพเลอร์:
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
พิจารณาว่าdrop
เป็นที่คาดคะเนทั่วไปที่เกี่ยวกับขนาดใดT
ก็เสียงไม่มีเหตุผลที่ว่า "ทั่วไปมากขึ้น" ลายเซ็นกันไม่ได้กับfn(_) -> _
for<'a> fn (&'a _) -> _
ทำไมคอมไพเลอร์ไม่ยอมรับลายเซ็นของdrop
ที่นี่และอะไรทำให้แตกต่างเมื่อการปิดห้องน้ำถูกแทนที่?