का कार्यान्वयन 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
यहाँ के हस्ताक्षर को स्वीकार क्यों नहीं कर रहा है, और जब टॉयलेट के बंद होने के बाद उसे रखा जाता है, तो क्या होता है?