Я разрабатываю библиотеку Lua, в которой мне была нужна к верхнему регистру первая буква данной строки. Следовательно я создал следующую функцию:
local capitalize = function(s)
return string.gsub (s,
"(%w)([%w]*)",
function (first, rest)
return string.upper(first) .. rest
end,
1 )
end
Это первоначально было "внутренней" функцией, используемой только на моей библиотеке.
Теперь я понял, что мои пользователи захотят использовать эту функцию в некоторых случаях.
Вопрос 1 я думаю о расширении таблицы строк, но я не уверен в том, как продолжить двигаться. Это достаточно, чтобы сделать это или является там более "lua-ориентированным" путем?
string.capitalize = function(s)
... etc etc (same code as above)
Вопрос 2 интересно, является ли это даже хорошая идея строке monkeypatch. Я должен обеспечить, общественность "используют для своей выгоды" функцию вместо этого?
РЕДАКТИРОВАНИЕ - В случае, если любой находит это в будущем, намного более простое, "использует для своей выгоды" функцию, показан на строковой странице рецептов:
str = str:gsub("^%l", string.upper)
] Я часто делаю расширения для встроенных таблиц. Я делаю это в первую очередь, когда мне кажется, что чего-то действительно важного не хватает. Заглавные буквы не попали в мой "важный" список, но что-то под названием []string.split[
] имеет, например.[
]Когда я делаю это, я следую конвенции по программированию:[
] [require 'stringutil' -- load extra stuff into string.*
require 'osutil' -- load extra stuff into os.*
]
[]Ты понимаешь идею. [
] []Другая вещь, которую я делаю, когда я осторожен, это слежу за тем, чтобы я не перезаписывал что-то, чего еще нет, так что я могу быть уверен в будущем:[
] [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
]
[]Функция []nameof[
] выглядит так:[
function nameof(val)
for name, v in pairs(_G) do if v == val then return name end end
return '?'
end
]
[]Заключительное замечание: когда я намереваюсь поделиться кодом с другими, я обычно не модифицирую предопределенные таблицы. Согласно Золотому правилу, это пространство имен разделяется всеми, и если я собираюсь, чтобы другие люди использовали мой код, то для меня нечестно просто захватывать любые поля в предопределенной таблице []string[
]. [
]Ответ на вопрос 1 - "да". Ответ на вопрос 2 - "это дело вкуса"[
].