2010-01-09 24 views
6

Tôi đang phát triển một thư viện Lua, trong đó tôi cần viết hoa chữ cái đầu tiên của một chuỗi đã cho. Do đó tôi đã tạo ra chức năng sau:"Mở rộng" bảng "chuỗi" - cách thực hiện? Nó thậm chí là một ý tưởng tốt?

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

Ban đầu, đây là chức năng "nội bộ", chỉ được sử dụng trên thư viện của tôi.

Bây giờ tôi đã nhận ra rằng người dùng của tôi sẽ muốn sử dụng chức năng này trong một số trường hợp.

Câu hỏi 1 Tôi đang nghĩ đến việc mở rộng bảng chuỗi, nhưng tôi không chắc chắn về cách tiếp tục. Là nó đủ để làm điều này, hoặc là có một cách "lua theo định hướng"?

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

Câu hỏi 2 Tôi tự hỏi nếu nó thậm chí còn là một ý tưởng tốt để monkeypatch chuỗi. Tôi có nên cung cấp chức năng "viết hoa" công khai thay thế không?

EDIT - Trong trường hợp có ai tìm thấy này trong tương lai, một đơn giản hơn nhiều "tận dụng" chức năng được hiển thị trên trang string recipes:

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

Trả lời

6

Tôi thường tạo các tiện ích mở rộng cho các bảng dựng sẵn. Tôi làm điều này chủ yếu khi tôi nghĩ rằng một cái gì đó thực sự quan trọng là mất tích. Viết hoa không tạo danh sách "quan trọng" của tôi, nhưng có tên là string.split chẳng hạn.

Khi tôi làm điều này tôi theo một quy ước lập trình:

require 'stringutil' -- load extra stuff into string.* 
require 'osutil'  -- load extra stuff into os.* 

Bạn nhận được các ý tưởng.

Một điều khác tôi làm khi tôi đang cẩn thận là chắc chắn rằng tôi không ghi đè lên một cái gì đó mà không phải là đã có, vì vậy mà tôi tương lai khả năng chống:

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 

Chức năng nameof như sau:

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

Lưu ý cuối cùng: khi tôi định chia sẻ mã với người khác, tôi có xu hướng không sửa đổi các bảng được xác định trước. Theo quy tắc vàng, không gian tên đó được chia sẻ bởi tất cả mọi người, và nếu tôi sẽ có người khác sử dụng mã của tôi, không công bằng cho tôi chỉ lấy bất cứ lĩnh vực nào tôi muốn trong bảng string được xác định trước.

+0

Cảm ơn bạn đã chia sẻ điều này. Cuối cùng tôi sẽ theo "lưu ý cuối cùng" của bạn và không phải chuỗi gây ô nhiễm với các chức năng của riêng tôi - tôi nghĩ rằng tôi đã tìm thấy một cách tốt hơn. Nhưng ghi chú của bạn có thể có ích trong tương lai. – kikito

2

Câu trả lời cho câu 1 là "có". Câu trả lời cho Câu hỏi 2 là "đó là vấn đề về hương vị".

Các vấn đề liên quan