“扩展”“字符串”表 – 怎么做?这甚至是个好主意吗?

我正在开发一个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
我想知道monkeypatch字符串是否是个好主意.我应该提供公共“大写”功能吗?

编辑 – 如果有人在将来发现这一点,string recipes页面上会显示一个更简单的“大写”功能:

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

功能名称是这样的:

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

最后说明:当我打算与其他人共享代码时,我倾向于不修改预定义的表.根据黄金法则,这个命名空间是由每个人共享的,如果我要让其他人使用我的代码,那么在我预定义的字符串表中抓取我想要的任何字段对我来说是不公平的.

相关文章
相关标签/搜索