سؤال

ولدي مهام متداخلة بعمق نسبيا في مجموعة من الجداول. هل هناك طريقة في C / C ++ للحصول على "المرجعية" لتلك الوظيفة، ودفع ذلك (وسائط) إلى المكدس عندما كنت في حاجة لاستخدامها؟

هل كانت مفيدة؟

المحلول

وهذا هو ما النظام المرجعي عبارة عن. وr = luaL_ref(L, LUA_REGISTRYINDEX) استدعاء دالة يخزن القيمة على الجزء العلوي من كومة في التسجيل وإرجاع عدد صحيح يمكن تخزينها على الجانب C ويستخدم لاسترداد قيمة مع lua_rawgeti(L, LUA_REGISTRYINDEX, r) استدعاء دالة.

PIL الفصل ، فضلا عن توثيق <أ href ل = "http://www.lua.org/manual/5.1/manual.html#luaL_ref" يختلط = "noreferrer"> luaL_ref() و <لأ href = "http://www.lua.org/manual /5.1/manual.html#lua_rawgeti "يختلط =" noreferrer "> lua_rawgeti() ، و <لأ href =" http://www.lua.org/manual/5.1/manual.html#luaL_unref "يختلط =" noreferrer "> luaL_unref() عن القصة الكاملة.

نصائح أخرى

ووAPI لوا ( http://www.lua.org/manual /5.1/manual.html#3 ) يمكن استخدامها لرصا أي أعضاء الجدول الذي تريد. استخدام lua_gettable () لاستخراج عضوا الجدول ووضعه على المكدس لوا، إذا كان العضو هو أيضا طاولة مجرد دعوة lua_gettable () مرة أخرى للوصول إلى هذا الجدول، وهلم جرا ...

و(اعتمادا على ما تفعلونه lua_rawget () قد يكون خيارا أفضل من lua_gettable ())

والإضافيون ردا على التعليق:

وحسنا هذا هو قليلا أكثر إثارة للاهتمام. حسنا، الجدول هو كائن المرجعية (أكثر أو أقل)، لذلك كنت على الأرجح آمنة لحفظ إشارة الجدول الأعمق في مكان ما.

ومنذ API لوا لا يبدو أن لديها على أي حال للتلاعب مباشرة من المرجع الجدول، ربما عليك دفع المرجع إلى العالمية، أو إذا لم يفلح ذلك جدول جديد مع إدخال جدول واحد. عندما تريد المرجع في وقت لاحق، مجرد الحصول عليه من المستوى العالمي.

ومنها مثلا.

// Final table reference is now at top of stack, after multiple dereferences
lua_setglobal( L, "mytableref" );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top