"Die" String "-Tabelle" verlängern " - wie geht es? Ist es überhaupt eine gute Idee?
-
19-09-2019 - |
Frage
Ich entwickle eine Lua -Bibliothek, in der ich den ersten Buchstaben einer bestimmten Saite in Großbuchstaben musste. Daher habe ich die folgende Funktion erstellt:
local capitalize = function(s)
return string.gsub (s,
"(%w)([%w]*)",
function (first, rest)
return string.upper(first) .. rest
end,
1 )
end
Dies war anfangs eine "interne" Funktion, die nur in meiner Bibliothek verwendet wurde.
Jetzt habe ich festgestellt, dass meine Benutzer diese Funktion in einigen Fällen verwenden möchten.
Frage 1Ich denke darüber nach, die String -Tabelle zu erweitern, bin mir aber nicht sicher, wie ich vorgehen soll. Ist es genug, um dies zu tun, oder gibt es eine "lua-orientierte" Art?
string.capitalize = function(s)
... etc etc (same code as above)
Frage 2Ich frage mich, ob es sogar eine gute Idee für die MonkeyPatch -String ist. Sollte ich stattdessen eine öffentliche "Kapitalisierung" -Funktion bereitstellen?
Bearbeiten - Falls jemand dies in Zukunft findet, wird eine weitaus einfachere "Kapitalisierung" -Funktion auf der angezeigt String -Rezepte Seite:
str = str:gsub("^%l", string.upper)
Lösung
Ich mache häufig Erweiterungen zu integrierten Tischen. Ich mache dies in erster Linie, wenn ich denke, dass etwas wirklich Wichtiges fehlt. Die Kapitalisierung hat meine "wichtige" Liste nicht gemacht, sondern etwas genannt string.split
hat zum Beispiel.
Wenn ich das mache, folge ich einer Programmierkonvention:
require 'stringutil' -- load extra stuff into string.*
require 'osutil' -- load extra stuff into os.*
Du hast die Idee.
Das andere, was ich tue, wenn ich vorsichtig bin, ist, dass ich nicht etwas überschreibe, das noch nicht da ist, damit ich zukunftssicher bin:
function extend(tab, field, val)
if tab[field] == nil then
tab[field] = val
return val
elseif tab[field] ~= val then
error(string.format('Extension %s.%s failed: already occupied by %s',
nameof(tab), field, tostring(val)))
else
return val
end
end
Das nameof
Funktion ist so:
function nameof(val)
for name, v in pairs(_G) do if v == val then return name end end
return '?'
end
Letzter Hinweis: Wenn ich beabsichtige, Code mit anderen zu teilen, neige ich dazu, die vordefinierten Tabellen nicht zu ändern. Nach der goldenen Regel wird dieser Namespace von allen geteilt, und wenn ich andere Leute mit meinem Code verwenden werde, ist es für mich nicht fair, nur die gewünschten Felder in der vordefinierten Felder zu greifen string
Tisch.
Andere Tipps
Die Antwort auf Frage 1 lautet "Ja". Die Antwort auf Frage 2 lautet "Es ist eine Frage des Geschmacks".