2012-04-26 11 views
13

एक सशर्त बनाने का उचित तरीका क्या है जो लुआ में कुछ की जांच या खाली नहीं है? if x == "" और f x ~= "" काम नहीं कर रहा है।लुआ में कोई मूल्य खाली होने पर कैसे जांचें?

+1

आप "खाली" कैसे परिभाषित करते हैं? –

+0

खाली अर्थ, इसमें कुछ भी टाइप नहीं है। – Village

+2

आप वैरिएबल में मान टाइप नहीं कर सकते हैं। क्या आप एक और सटीक परिभाषा दे सकते हैं? क्योंकि एक चर जो '' "स्ट्रिंग रखता है" खाली "नहीं है। इसमें एक स्ट्रिंग है। अर्थात् '" "'। एक वैध स्ट्रिंग कौन सा है। और इसलिए कुछ भी नहीं। –

उत्तर

14

लुआ गतिशील रूप से टाइप-आधारित भाषा है।
किसी भी चर निम्नलिखित प्रकारों में से एक पकड़ कर सकते हैं: शून्य, बूलियन, संख्या, स्ट्रिंग, तालिका, समारोह, धागा, या userdata
किसी तालिका में कोई भी चर (_G, तालिका जहां ग्लोबल्स रहते हैं) बिना किसी मान के अनुक्रमित होने पर nil का मान देता है। जब आप nil पर तालिका चर सेट करते हैं, तो यह अनिवार्य रूप से "अविकसित" होता है (पूरी तरह से स्मृति से प्रविष्टि को हटाता है)।
जब local चर घोषित किया जाता है, यदि इसे तत्काल असाइन नहीं किया गया है तो इसे nil का मान दिया जाता है। तालिका चर के विपरीत, जब आप local वैरिएबल को nil पर सेट करते हैं, तो यह "अविकसित" नहीं है (यह केवल nil का मान है)।

लुआ में, एक खाली स्ट्रिंग ("") अभी भी एक "मान" है - यह केवल आकार शून्य की एक स्ट्रिंग है।

+0

मुझे लगता है कि "_ जब आप एक चर को शून्य पर सेट करते हैं, तो यह अनिवार्य रूप से" अविकसित "होता है" यह थोड़ा गलत है — 'nil' अंदरूनी तालिकाओं को छोड़कर एक वास्तविक मूल्य है, उदाहरण के लिए, एक स्थानीय चर वैल्यू 'शून्य' के साथ आसपास के क्षेत्रों में छाया चर ... – snogglethorpe

+0

आप बिल्कुल सही हैं; उस कथन का उद्देश्य टेबल जोड़े पर था, सामान्य रूप से सभी चरों पर नहीं। इसे प्रतिबिंबित करने के लिए उत्तर संशोधित किया गया है। – Deco

+0

@snogglethorpe 'यदि नहीं के बराबर तो \t प्रिंट (" शून्य सच है ") बाकी \t प्रिंट (" शून्य सच नहीं है! ") end' -> शून्य सच नहीं है! – handle

1

आपके पास शायद आपकी स्ट्रिंग में रिक्त स्थान, न्यूलाइन या अन्य गैर-दृश्य वर्ण हैं। तो आपको लगता है कि यह "खाली" है, लेकिन ऐसा नहीं है। यह आम तौर पर तब होता है जब आप उपयोगकर्ता से इनपुट ले रहे हैं, और "एंटर" को समाप्त करने के लिए "एंटर" टाइप करना होगा - स्ट्रिंग में "एंटर" समाप्त होता है।

आपको जो चाहिए वह एक ऐसा फ़ंक्शन है जो आपको बताता है कि स्ट्रिंग "खाली" है या तो खाली है, या रिक्त स्थान/टैब/न्यूलाइन की एक सूची है।

function isBlank(x) 
    return not not tostring(x):find("^%s*$") 
end 

उपयोग::

if isBlank(x) then 
    -- ... 
end 
+2

काफी अक्षम है; 'स्ट्रिंग नहीं है। ढूँढें (एक्स, "^% एस * $") ' – daurnimator

+0

ठीक है, आपका संस्करण निश्चित रूप से है (एक बार जब आप ओमेटेड टॉस्ट्रिंग कॉल शामिल करते हैं)। मुझे यकीन नहीं है कि यह काफी तेज है। आप ऐसा क्यों सोचते हैं? – kikito

+0

'string.gsub'' string.find' की तुलना में उस ऑपरेशन के लिए बहुत सारी मेमोरी आवंटित करेगा (एक नई स्ट्रिंग जिसे प्रतिस्थापित किया गया है, प्रतिस्थापन के लिए एक या दो बफर)। – Deco

3

मैं हाल ही में इस समस्या को भर में भाग गया यहाँ एक तरह से यह करने के लिए है। यदि डेटाबेस मान 'खाली' था (शून्य नहीं) तो LuaSQL रिक्त स्ट्रिंग वापस कर रहा था। एक हैकी दृष्टिकोण, लेकिन यहां मैंने इसे हल किया है:

if (string.len(x) >= 1) then 
    ... 
end 
संबंधित मुद्दे