"Die" String "-Tabelle" verlängern " - wie geht es? Ist es überhaupt eine gute Idee?

StackOverflow https://stackoverflow.com/questions/2031943

  •  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)
War es hilfreich?

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".

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top