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