سؤال

في C ، لدي سلاسل تنسيق ، شيء مثل:

char *msg = "wlll you marry me"
fprintf(stderr, "%s, %s?", name, msg);

الآن ، هل يمكنني فعل شيء مشابه في لوا مع سلاسل التنسيق؟ أي أريد شيئًا مكافئًا وظيفيًا:

name .. ", " .. msg .. "?"

ولكن ليس قبيح جدا ، في لوا.

حسنًا ، حتى أتمكن من القيام string.format ("٪ s ، ٪ s؟" ، الاسم ، msg) ، ولكن هل يمكنني حتى أن أذهب إلى أبعد من ذلك ، شيء مثل نمط بيرل ، حيث يمكنني الذهاب:

"%name, %msg?"

شكرًا!

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

المحلول

بحسب ال مقالة مستخدمي LUA على interpolation سلسلة, ، لا يقدم لوا طريقة محلية مدمجة للقيام بذلك ؛ ومع ذلك ، هناك بعض الحلول التي تم نشرها في تلك الصفحة.

إليك تطبيق واحد بسيط (- Ricilake):

function interp(s, tab)
  return (s:gsub('($%b{})', function(w) return tab[w:sub(3, -2)] or w end))
end
print( interp("${name} is ${value}", {name = "foo", value = "bar"}) )

getmetatable("").__mod = interp
print( "${name} is ${value}" % {name = "foo", value = "bar"} )
-- Outputs "foo is bar"

نصائح أخرى

هل يمكنني القيام بشيء مماثل [للطباعة] مع سلاسل تنسيق لوا؟

نعم. أفعل هذا في كل وقت:

local function printf(...) return io.stdout:write(string.format(...)) end

local function fprintf(f, ...) return f:write(string.format(...)) end

تعديل لتذوق.

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