«Étendre» le tableau «String» - comment le faire? Est-ce même une bonne idée?

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

  •  19-09-2019
  •  | 
  •  

Question

Je développe une bibliothèque LUA dans laquelle je devais maîtriser la première lettre d'une chaîne donnée. J'ai donc créé la fonction suivante:

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

Il s'agissait initialement d'une fonction "interne", utilisée uniquement sur ma bibliothèque.

Maintenant, j'ai réalisé que mes utilisateurs voudront utiliser cette fonction dans certains cas.

question 1Je pense à étendre la table des cordes, mais je ne suis pas sûr de la façon de procéder. Est-ce suffisant pour le faire, ou y a-t-il une manière plus «orientée Lua»?

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

question 2Je me demande si c'est même une bonne idée de la chaîne MonkeyPatch. Dois-je fournir une fonction publique "capitaliser" à la place?

EDIT - Au cas où quelqu'un le trouvera à l'avenir, une fonction "capitaliser" beaucoup plus simple est indiquée sur le recettes de cordes page:

str = str:gsub("^%l", string.upper)
Était-ce utile?

La solution

Je fais souvent des extensions aux tables intégrées. Je le fais principalement quand je pense que quelque chose de vraiment important manque. La capitalisation n'a pas fait ma liste "importante", mais quelque chose appelé string.split a, par exemple.

Quand je fais cela, je suis une convention de programmation:

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

Vous avez eu l'idée.

L'autre chose que je fais lorsque je fais attention, c'est de s'assurer que je n'écrase pas quelque chose qui n'est pas déjà là, afin que je sois à l'épreuve du temps:

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 nameof La fonction est comme ceci:

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

Remarque finale: lorsque j'ai l'intention de partager du code avec d'autres, j'ai tendance à ne pas modifier les tables prédéfinies. Selon la règle d'or, cet espace de noms est partagé par tout le monde, et si je vais avoir d'autres personnes qui utilisent mon code, ce n'est pas juste pour moi de saisir les champs que je veux dans le prédéfini string table.

Autres conseils

La réponse à la question 1 est "oui". La réponse à la question 2 est "c'est une question de goût".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top