“Estendere” la “stringa” tavolo - come farlo? E 'anche una buona idea?
-
19-09-2019 - |
Domanda
sto sviluppando una libreria Lua in cui avevo bisogno in maiuscolo la prima lettera di una stringa data. Quindi ho creato la seguente funzione:
local capitalize = function(s)
return string.gsub (s,
"(%w)([%w]*)",
function (first, rest)
return string.upper(first) .. rest
end,
1 )
end
Questa inizialmente era una funzione di "interno", utilizzato solo sulla mia biblioteca.
Ora ho capito che i miei utenti vorranno utilizzare questa funzione in alcuni casi.
Domanda 1 Sto pensando di estendere la tabella di stringhe, ma non sono sicuro su come procedere. E 'abbastanza per fare questo, o c'è un modo più "lua-oriented"?
string.capitalize = function(s)
... etc etc (same code as above)
Domanda 2 Mi chiedo se è anche una buona idea per monkeypatch stringa. Devo fornire una funzione pubblica "capitalizzare" invece?
Modifica - Nel caso in cui qualcuno trova questo in futuro, una funzione molto più semplice "capitalizzare" viene visualizzato sul ricette stringa pagina:
str = str:gsub("^%l", string.upper)
Soluzione
Mi capita spesso di fare le estensioni di builtin tabelle. Lo faccio soprattutto quando penso qualcosa di veramente importante è mancante. La capitalizzazione non ha fatto la mia lista "importante", ma qualcosa che si chiama string.split
ha, per esempio.
Quando faccio questo seguo una convenzione di programmazione:
require 'stringutil' -- load extra stuff into string.*
require 'osutil' -- load extra stuff into os.*
Si ottiene l'idea.
L'altra cosa che faccio quando sto facendo attenzione è assicurarsi che io non sovrascrivere qualcosa che non è già presente, in modo che io sono a prova di futuro:
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
La funzione nameof
è come questo:
function nameof(val)
for name, v in pairs(_G) do if v == val then return name end end
return '?'
end
Nota finale: quando ho intenzione di condividere il codice con gli altri, tendo a non modificare le tabelle predefinite. Secondo la regola d'oro, che spazio dei nomi è condiviso da tutti, e se ho intenzione di avere altre persone usando il mio codice, non è giusto per me solo per afferrare tutto quello che voglio campi nella tabella string
predefinito.
Altri suggerimenti
La risposta alla domanda 1 è "sì". La risposta alla domanda 2 è "è una questione di gusto".