2010-01-09 18 views
6

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

编辑 - 如果任何人认为这在未来,一个简单得多的“利用”功能显示在string recipes页:

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

回答

6

我经常对内建表进行扩展。我主要是在我认为重要的东西缺失时这样做的。大写还没有成为我的“重要”名单,但是例如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表中抓取我想要的任何字段是不公平的。

+0

感谢您分享。我终于会按照你的“最后说明”而不是用我自己的功能污染字符串 - 我想我找到了一个更好的方法。但你的笔记在将来可能会派上用场。 – kikito 2010-01-10 12:10:25

2

回答问题1是“是”。问题2的答案是“这是一个品味问题”。

相关问题