2010-01-09 9 views
6

मैं एक लुआ लाइब्रेरी विकसित कर रहा हूं जिसमें मुझे किसी दिए गए स्ट्रिंग के पहले अक्षर को अपरकेस करने की आवश्यकता है। इसलिए मैंने निम्नलिखित फ़ंक्शन बनाया:"स्ट्रिंग" तालिका "विस्तार करें" - इसे कैसे करें? क्या यह भी एक अच्छा विचार है?

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) 

उत्तर

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

2

जवाब प्रश्न 1 "हाँ" है। प्रश्न 2 का जवाब "यह स्वाद का मामला है"।

संबंधित मुद्दे