Avatar ·

استدعاءات اصطلاحية في 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