سؤال
كنت أتساءل عما إذا كانت هناك طريقة للقيام بملف LUA مرة واحدة فقط ولدي أي محاولات لاحقة للقيام بهذا ملف LUA سيؤدي إلى عدم وجود op.
لقد فكرت بالفعل في القيام بشيء أقرب إلى C ++ Header #IF/else/endif. أتساءل عما إذا كانت هناك طريقة قياسية لتنفيذ هذا.
جوامع
المحلول
نحن سوف، require
إلى حد كبير يفعل ذلك.
require "file" -- runs "file.lua"
require "file" -- does not run the "file" again
نصائح أخرى
المشكلة الوحيدة في طلبها هي أنه يعمل على أسماء الوحدات ، وليس أسماء الملفات. على وجه الخصوص ، لا تتعامل المتطلبات مع الأسماء مع مسارات (على الرغم من أنها تستخدم package.path و package.cpath لتحديد الوحدات النمطية في نظام الملفات).
إذا كنت ترغب في التعامل مع الأسماء بالمسارات ، يمكنك كتابة غلاف بسيط إلى dofile على النحو التالي:
do
local cache={}
local olddofile=dofile
function dofile(x)
if cache[x]==nil then
olddofile(x)
cache[x]=true
end
end
end
بناءً على إجابة LHF ، ولكن الاستخدام package
, ، يمكنك أيضًا القيام بذلك مرة واحدة:
package.preload["something"]=dofile "/path/to/your/file.lua"
ثم استخدم:
local x=require "something"
للحصول على الحزمة المسبقة مرة أخرى. لكن هذا مسيء بعض الشيء ...