2010-01-09 24 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的答案是「這是一個品味問題」。

相關問題