2013-10-29 9 views
27

में खाली नहीं है मैं निम्न सिंटैक्स का उपयोग कर कुछ वर्तमान में कुछ लुआ कोड है , न तो एक शून्य मूल्य।जांच करें कि एक स्ट्रिंग नहीं के बराबर या लुआ

क्या यह कोड दो में परीक्षण के बाद एक में सरलीकृत किया जा सकता है?

+0

तो, आप वास्तव में foo, bar या foo.bar का परीक्षण कर रहे हैं? अगर आपके पास 'foo.bar' होगा, तो आपके पास कुछ फ़ंक्शन जैसे' स्थानीय फ़ंक्शन टेस्ट (foo, bar) {if (foo.bar == nil या foo.bar == '') हो सकता है, फिर foo.bar = " कुछ डिफ़ॉल्ट मान "एंड एंड" जो चाल करेगा। – Kamiccolo

+0

foo = foo या "कुछ डिफ़ॉल्ट मान" –

+0

मान लीजिए कि आप 'झूठी' की गणना नहीं करना चाहते हैं, तो आप 'if (foo ==' ') का उपयोग कर सकते हैं ...' लेकिन अन्यथा यह है जितना छोटा हो उतना छोटा हो जाता है। –

उत्तर

38

एक साधारण चीज जो आप कर सकते हैं वह एक समारोह के अंदर परीक्षण सार है।

local function isempty(s) 
    return s == nil or s == '' 
end 

if isempty(foo) then 
    foo = "default value" 
end 
+0

यदि आप लंबाई लंबा है तो 0 की गणना कैसे करें? उदाहरण के लिए: foo length 2 – YumYumYum

+1

है आप 'string.len' फ़ंक्शन का उपयोग कर सकते हैं। लेकिन यह जांचने के लिए कि यह शून्य से अधिक है ~ ~ '' '' काम भी करता है। – hugomg

9

इस कोड को अगर बजाय परीक्षण दो में से एक में सरल किया जा सकता है?

nil और '' अलग-अलग मान हैं। यदि आपको परीक्षण करना है कि s न तो है, तो आईएमओ आपको केवल दोनों के खिलाफ तुलना करनी चाहिए, क्योंकि यह आपके इरादे को सबसे स्पष्ट बनाता है।

कि और कुछ विकल्प हैं, उनके उत्पन्न बाईटकोड साथ:

if not foo or foo == '' then end 
    GETGLOBAL  0 -1 ; foo 
    TEST   0 0 0 
    JMP    3  ; to 7 
    GETGLOBAL  0 -1 ; foo 
    EQ    0 0 -2 ; - "" 
    JMP    0  ; to 7 

if foo == nil or foo == '' then end 
    GETGLOBAL  0 -1 ; foo 
    EQ    1 0 -2 ; - nil 
    JMP    3  ; to 7 
    GETGLOBAL  0 -1 ; foo 
    EQ    0 0 -3 ; - "" 
    JMP    0  ; to 7 

if (foo or '') == '' then end 
    GETGLOBAL  0 -1 ; foo 
    TEST   0 0 1 
    JMP    1  ; to 5 
    LOADK   0 -2 ; "" 
    EQ    0 0 -2 ; - "" 
    JMP    0  ; to 7 

दूसरा लुआ 5.1 और 5.2 (मेरी मशीन पर वैसे भी) में सबसे तेजी से है, लेकिन अंतर छोटे है। मैं स्पष्टता के लिए पहली बार जाऊंगा।

+4

पहला और तीसरा व्यक्ति वही काम नहीं करता है जब 'foo'' false' होता है। – catwell

+0

'foo ==' 'के बजाय खाली स्ट्रिंग की जांच के लिए '#foo == 0' का उपयोग करने के बारे में कैसे - क्या इसमें तेजी से होने का मौका है? –

+3

यह एक बुरा विचार नहीं है। लुआ तार आंतरिक रूप से अपनी लंबाई बनाए रखते हैं, इसलिए आपको पात्रों की गणना नहीं करनी पड़ेगी। लेकिन लुआ भी तारों को प्रशिक्षित करता है, इसलिए समानता की जांच करने के लिए पात्रों को देखने की आवश्यकता नहीं होती है; आप बस जांचें कि क्या वस्तुएं समान हैं या नहीं। तो दोनों * तेजी से होना चाहिए, लेकिन यह स्ट्रिंग लम्बाई को पुनर्प्राप्त करने के लिए कोड पथ को कोड पथ से थोड़ा लंबा है, ताकि वे दो ऑब्जेक्ट पॉइंटर्स को वीएम स्टैक से तुलना करने के लिए प्राप्त कर सकें, इसलिए '#foo == 0' 5.1 में थोड़ी सी 'foo ==' 'से धीमी है और 5.2 और 5.3 में बहुत कुछ है (जैसा कि मेरी मशीन पर बेंचमार्किंग द्वारा निर्धारित किया गया है)। – Mud

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