में खाली नहीं है मैं निम्न सिंटैक्स का उपयोग कर कुछ वर्तमान में कुछ लुआ कोड है , न तो एक शून्य मूल्य।जांच करें कि एक स्ट्रिंग नहीं के बराबर या लुआ
क्या यह कोड दो में परीक्षण के बाद एक में सरलीकृत किया जा सकता है?
में खाली नहीं है मैं निम्न सिंटैक्स का उपयोग कर कुछ वर्तमान में कुछ लुआ कोड है , न तो एक शून्य मूल्य।जांच करें कि एक स्ट्रिंग नहीं के बराबर या लुआ
क्या यह कोड दो में परीक्षण के बाद एक में सरलीकृत किया जा सकता है?
एक साधारण चीज जो आप कर सकते हैं वह एक समारोह के अंदर परीक्षण सार है।
local function isempty(s)
return s == nil or s == ''
end
if isempty(foo) then
foo = "default value"
end
इस कोड को अगर बजाय परीक्षण दो में से एक में सरल किया जा सकता है?
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 (मेरी मशीन पर वैसे भी) में सबसे तेजी से है, लेकिन अंतर छोटे है। मैं स्पष्टता के लिए पहली बार जाऊंगा।
पहला और तीसरा व्यक्ति वही काम नहीं करता है जब 'foo'' false' होता है। – catwell
'foo ==' 'के बजाय खाली स्ट्रिंग की जांच के लिए '#foo == 0' का उपयोग करने के बारे में कैसे - क्या इसमें तेजी से होने का मौका है? –
यह एक बुरा विचार नहीं है। लुआ तार आंतरिक रूप से अपनी लंबाई बनाए रखते हैं, इसलिए आपको पात्रों की गणना नहीं करनी पड़ेगी। लेकिन लुआ भी तारों को प्रशिक्षित करता है, इसलिए समानता की जांच करने के लिए पात्रों को देखने की आवश्यकता नहीं होती है; आप बस जांचें कि क्या वस्तुएं समान हैं या नहीं। तो दोनों * तेजी से होना चाहिए, लेकिन यह स्ट्रिंग लम्बाई को पुनर्प्राप्त करने के लिए कोड पथ को कोड पथ से थोड़ा लंबा है, ताकि वे दो ऑब्जेक्ट पॉइंटर्स को वीएम स्टैक से तुलना करने के लिए प्राप्त कर सकें, इसलिए '#foo == 0' 5.1 में थोड़ी सी 'foo ==' 'से धीमी है और 5.2 और 5.3 में बहुत कुछ है (जैसा कि मेरी मशीन पर बेंचमार्किंग द्वारा निर्धारित किया गया है)। – Mud
तो, आप वास्तव में foo, bar या foo.bar का परीक्षण कर रहे हैं? अगर आपके पास 'foo.bar' होगा, तो आपके पास कुछ फ़ंक्शन जैसे' स्थानीय फ़ंक्शन टेस्ट (foo, bar) {if (foo.bar == nil या foo.bar == '') हो सकता है, फिर foo.bar = " कुछ डिफ़ॉल्ट मान "एंड एंड" जो चाल करेगा। – Kamiccolo
foo = foo या "कुछ डिफ़ॉल्ट मान" –
मान लीजिए कि आप 'झूठी' की गणना नहीं करना चाहते हैं, तो आप 'if (foo ==' ') का उपयोग कर सकते हैं ...' लेकिन अन्यथा यह है जितना छोटा हो उतना छोटा हो जाता है। –