বাস্তবায়ন 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
এখানে স্বাক্ষর স্বীকার করছে না এবং টয়লেট বন্ধ হওয়ার স্থানে রাখলে কী আলাদা হয়?