«Расширить» таблицу «string» - как это сделать? Это даже хорошая идея? - PullRequest
6 голосов
/ 09 января 2010

Я разрабатываю библиотеку Lua, в которой мне нужно было прописать первую букву данной строки в верхнем регистре. Поэтому я создал следующую функцию:

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

Изначально это была "внутренняя" функция, используемая только в моей библиотеке.

Теперь я понял, что мои пользователи захотят использовать эту функцию в некоторых случаях.

Вопрос 1 Я думаю о расширении таблицы строк, но я не уверен, что делать дальше. Достаточно ли этого, или есть более «ориентированный на Луа» способ?

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

Вопрос 2 Интересно, будет ли хорошей идеей написать строку с обезьяной? Должен ли я вместо этого предоставить публичную функцию "прописных букв"?

РЕДАКТИРОВАТЬ - В случае, если кто-нибудь найдет это в будущем, гораздо более простая функция «заглавных букв» будет показана на строковых рецептах страница:

str = str:gsub("^%l", string.upper)

Ответы [ 2 ]

6 голосов
/ 09 января 2010

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

3 голосов
/ 09 января 2010

Ответ на вопрос 1 - «да». Ответ на вопрос 2 «это дело вкуса».

...