“Расширьте” “строковую” таблицу - как сделать это? Это - даже хорошая идея?

Я разрабатываю библиотеку 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)

6
задан kikito 26 January 2010 в 11:49
поделиться

2 ответа

[

] Я часто делаю расширения для встроенных таблиц. Я делаю это в первую очередь, когда мне кажется, что чего-то действительно важного не хватает. Заглавные буквы не попали в мой "важный" список, но что-то под названием []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[]. [

]
7
ответ дан 10 December 2019 в 00:39
поделиться
[

]Ответ на вопрос 1 - "да". Ответ на вопрос 2 - "это дело вкуса"[

].
3
ответ дан 10 December 2019 в 00:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: