سؤال

كنت أتساءل عما إذا كانت هناك طريقة للقيام بملف 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"

للحصول على الحزمة المسبقة مرة أخرى. لكن هذا مسيء بعض الشيء ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top