ग्रूवी में:ग्रोवी सत्य: बुलियन असंगतता के लिए स्ट्रिंग?
println 'test' as Boolean //true
println 'test'.toBoolean() //false
println new Boolean('test') //false
किसी को भी इस व्यवहार को स्पष्ट कर सकते हैं?
ग्रूवी में:ग्रोवी सत्य: बुलियन असंगतता के लिए स्ट्रिंग?
println 'test' as Boolean //true
println 'test'.toBoolean() //false
println new Boolean('test') //false
किसी को भी इस व्यवहार को स्पष्ट कर सकते हैं?
println 'test'.toBoolean() //false
println new Boolean('test') //false
इन्स्तांत एक java.lang.Boolean
के निर्माता है कि एक एकल स्ट्रिंग तर्क लेता का उपयोग कर
दोनों। the javadocs के अनुसार, नियम है:
एक बूलियन वस्तु मान सत्य का प्रतिनिधित्व करता है, तो स्ट्रिंग तर्क "सही" स्ट्रिंग के लिए रिक्त नहीं है और बराबर है, मामले की अनदेखी, का आवंटन। अन्यथा, एक बूलियन ऑब्जेक्ट आवंटित करें जो मूल्य को गलत मानता है।
उपर्युक्त दोनों मामलों में, स्ट्रिंग 'सत्य' (केस-असंवेदनशील) से मेल नहीं खाती है, इसलिए बूलियन बनाया गया है।
विपरीत 'test' as Boolean
तक जो आपको लिखने की अनुमति देता coercion to a boolean के लिए ग्रूवी भाषा के नियमों, इस प्रकार है:
if ('hello') {
println 'this string is truthy'
}
एक स्ट्रिंग के लिए, नियम यह है कि अगर यह खाली या शून्य है, यह गलत का आकलन, अन्यथा सच है।
मैं मानता हूं कि इसे थोड़ा असंगत माना जा सकता है, लेकिन java.lang.Boolean
और उपयोगिता के कंसक्टर के साथ स्थिरता के बीच एक विकल्प दिया गया, मुझे लगता है कि वे बाद वाले को चुनने का अधिकार रखते थे।
बूलियन कन्स्ट्रक्टर आपके द्वारा दी गई स्ट्रिंग ले रहा है और उस स्ट्रिंग पर toBoolean()
विधि चला रहा है। संक्षेप में, को पार्स नहीं कर सकता है क्योंकि वैध बूलियन मान को झूठा माना जाता है। या, दूसरे शब्दों में, केवल 'सत्य' सच है।
मैं कन्स्ट्रक्टर के बारे में @ cdeszaq के बिंदु से सहमत हूं, और जहां तक आपका पहला उदाहरण माना जाता है, मैं कहूंगा कि यह सिर्फ एक बूल को कास्टिंग कर रहा है। जब तक सूचक शून्य नहीं है तब तक यह सच होगा। मुझे लगता है कि .toBoolean()
वास्तव में अपने ऑब्जेक्ट वैल्यू को पार्स करने का प्रयास करता है। वे क्या लौटते हैं यह देखने के लिए 'true'.toBoolean()
और '1'.toBoolean()
निष्पादित करने पर विचार करें।
मैंने इस सवाल से पहले कभी ग्रोवी के बारे में नहीं सुना है, यह सब गलत हो सकता है।
'1'.toBoolean() सत्य लौटाता है। आप इसे यहां देख सकते हैं: http://groovyconsole.appspot.com/ – Raphael
चीयर्स, सहायक लिंक! +1 –
डॉन कि में हैं:
'test' as Boolean
के लिए coercion to a boolean
जो भी "ग्रूवी सच" के रूप में जाना जाता है ग्रूवी भाषा नियमों का पालन करती।
लेकिन String.toBoolean()
ग्रोवी में स्ट्रिंग के साथ एक बूलियन का निर्माण केवल तर्क के रूप में नहीं करता है। groovy api docs on String.toBoolean() से:
String.toBoolean()
दिए गए स्ट्रिंग को एक बूलियन ऑब्जेक्ट में परिवर्तित करता है। यदि छंटनी हुई स्ट्रिंग "सत्य", "वाई" या "1" (केस को अनदेखा कर रही है) तो परिणाम सत्य है अन्यथा यह गलत है।
A few good examples for strings and their conversion with toBoolean():
assert "y".toBoolean()
assert 'TRUE'.toBoolean()
assert ' trUe '.toBoolean()
assert " y".toBoolean()
assert "1".toBoolean()
assert ! 'other'.toBoolean()
assert ! '0'.toBoolean()
assert ! 'no'.toBoolean()
assert ! ' FalSe'.toBoolean()
तथापि, अन्य वस्तुओं पर लागू, कोई विसंगति पैदा होती है:
int i = 0
String s = 'abc'
if (s)
println 's is true' // will be printed
if (i)
println ' i "is true" ' // will not be printed
(ग्रूवी 1.7.8)
आप स्पष्ट होना जरूरी दूसरे में, अगर (i! = null) या अगर (i! = 0)
अगर कुछ (i) का उपयोग कर गैर-शून्य पूर्णांक की जांच करने के लिए कुछ बग का पता लगाया जा सकता है।
मुझे लगता है कि आपको "इन दोनों" – ataylor
@ataylor सुधार के लिए धन्यवाद के पहले दो झूठे मामलों को दिखाने का मतलब है, मैंने जवाब अपडेट किया है –