«Étendre» le tableau «String» - comment le faire? Est-ce même une bonne idée?
-
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)
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".