7

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

编辑 - 万一将来有人发现这个,字符串食谱页面上会显示一个更简单的“大写”功能:

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

2 回答 2

8

我经常对内置表进行扩展。我主要是在我认为缺少某些非常重要的东西时这样做。大写字母并没有成为我的“重要”列表,但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表中获取我想要的任何字段对我来说是不公平的。

于 2010-01-09T04:28:06.707 回答
3

问题 1 的答案是“是”。问题 2 的答案是“口味问题”。

于 2010-01-09T02:10:05.303 回答