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)
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top