استدعاءات اصطلاحية في Rust: كيفية تمرير الدوال والإغلاقات بشكل صحيح
مرحبًا أيها الزملاء! بدأت في تعلم Rust بعد C++ ولا أستطيع فهم كيفية عمل الاستدعاءات بشكل صحيح. في C++، كنت ببساطة أمرر std::function أو مؤشرًا لدالة. هنا كل شيء أكثر صرامة فيما يتعلق بالملكية وعمر المتغيرات.
المشكلة: أريد كتابة معالج أحداث بسيط. هناك هيكل Button يجب أن يستدعي دالة مستخدم عند الضغط. في C++ كنت سأفعل هكذا:
```cpp
struct Button {
std::function onClick;
void press() { if(onClick) onClick(); }
};
```
أحاول إعادة كتابته في Rust:
```rust
struct Button {
callback: fn(), // أحاول استخدام مؤشر دالة
}
impl Button {
fn press(&self) {
(self.callback)();
}
}
```
هذا يعمل فقط مع الدوال العادية، وليس مع الإغلاقات التي تلتقط المتغيرات. إذا كتبت:
```rust
let mut count = 0;
let button = Button {
callback: || { count += 1; } // خطأ! نوع غير متطابق
};
```
المترجم يشتكي: "expected fn item, found closure". لقد قرأت عن Box