Pregunta

Estoy desarrollando una biblioteca Lua en la que necesitaba aumentar la primera letra de una cadena dada. Por lo tanto, creé la siguiente función:

local capitalize = function(s)
  return string.gsub (s,
    "(%w)([%w]*)",
    function (first, rest) 
      return string.upper(first) .. rest
    end, 
    1 )
end

Inicialmente, esta era una función "interna", utilizada solo en mi biblioteca.

Ahora me he dado cuenta de que mis usuarios querrán usar esta función en algunos casos.

Pregunta 1Estoy pensando en extender la tabla de cuerdas, pero no estoy seguro de cómo proceder. ¿Es suficiente hacer esto, o hay una forma más "orientada a Lua"?

string.capitalize = function(s)
  ... etc etc (same code as above)

Pregunta 2Me pregunto si incluso es una buena idea para monkapatch String. ¿Debo proporcionar una función pública de "capitalizar" en su lugar?

Editar: en caso de que alguien encuentre esto en el futuro, se muestra una función de "capitalizar" mucho más simple en el recetas de cadena página:

str = str:gsub("^%l", string.upper)
¿Fue útil?

Solución

Con frecuencia hago extensiones a las mesas construidas. Hago esto principalmente cuando creo que falta algo realmente importante. La capitalización no ha hecho mi lista "importante", sino algo llamado string.split tiene, por ejemplo.

Cuando hago esto, sigo una convención de programación:

require 'stringutil' -- load extra stuff into string.*
require 'osutil'     -- load extra stuff into os.*

Entiendes la idea.

La otra cosa que hago cuando tengo cuidado es asegurarme de no sobrescribir algo que no esté allí, de modo que esté a prueba de 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

los nameof la función es así:

function nameof(val)
    for name, v in pairs(_G) do if v == val then return name end end
    return '?'
end

Nota final: Cuando tengo la intención de compartir código con otros, tiendo a no modificar las tablas predefinidas. Según la regla de oro, ese espacio de nombres es compartido por todos, y si voy a hacer que otras personas usen mi código, no es justo para mí solo tomar los campos que quiera en lo predefinido string mesa.

Otros consejos

La respuesta a la pregunta 1 es "sí". La respuesta a la pregunta 2 es "Es una cuestión de gusto".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top