2012-02-25 14 views
26

में टिल्ड ऑपरेटर ~ स्कैला के इस बिट में क्या करता है?स्कैला

उदाहरण के लिए:

scala> val apple = 1 
apple: Int = 1 

scala> ~apple 
res0: Int = -2 

क्या है कि कीड़ा मेरे सेब लिए क्या किया?

+2

Scalex, स्केला के लिए hoogle की तरह: http://scalex.org/?q=~ –

+0

@GeneT लिंक – sjking

उत्तर

46

सबसे पहले, कुछ मेटा-सलाह। जब भी आप सोच रहे हों कि कंपाइलर कुछ वाक्य रचनात्मक चीनी कैसे फैलाता है, एक प्रकार का अनुमान लगाता है, या एक अंतर्निहित रूपांतरण लागू करता है, तो आपको यह दिखाने के लिए scala -Xprint:typer -e <expr> का उपयोग करें।

scala -Xprint:typer -e "val a = 2; ~a" 

... 
private[this] val a: Int = 2; 
private <stable> <accessor> def a: Int = $anon.this.a; 
$anon.this.a.unary_~ 

ठीक है, एक उपसर्ग ~unary_~ का एक नियमित विधि मंगलाचरण के लिए विस्तार किया गया है।

language specification से

:

6.12.1 पूर्व fi x संचालन

एक पूर्व fi x आपरेशन सेशन ई एक पूर्व fi x ऑपरेटर सेशन है, जो पहचान फाई ईआरएस में से एक +, -, ! या होना चाहिए होते हैं ~। अभिव्यक्ति op e पोस्ट फाई विधि विधि e.unary_op के बराबर है।

प्री-फाई ऑपरेटरों में सामान्य फ़ंक्शन अनुप्रयोगों से अलग हैं कि उनके ऑपरेंड अभिव्यक्ति परमाणु नहीं होना चाहिए। उदाहरण के लिए, इनपुट अनुक्रम -sin(x)-(sin(x)) के रूप में पढ़ा जाता है, जबकि फ़ंक्शन एप्लिकेशन नकारात्मक sin(x) को के अनुप्रयोग के रूप में पार्स किया गया है, जो एक्स ऑपरेटर पाप में ऑपरेटरों को नकारात्मक और (x) के पाप के रूप में पार्स किया जाएगा।

इसका मतलब है कि उपसर्ग ऑपरेटरों प्रकार में बनाया करने के लिए ही सीमित नहीं हैं, वे अपने स्वयं के प्रकार पर इस्तेमाल किया जा सकता है (हालांकि यह इस शक्ति के साथ पागल जाने के लिए एक अच्छा विचार नहीं है!)

scala> object foo { def unary_~ = "!!!" } 
defined module foo 

scala> ~foo 
res0: java.lang.String = !!! 

तो, आपका प्रश्न क्या है? आप methods starting with u के लिए मानक लाइब्रेरी के लिए ScalaDoc की अनुक्रमणिका को चेकआउट कर सकते हैं। nightly ScalaDoc ने हाल ही में इस विधि के लिए दस्तावेज जोड़ा है।

the bitwise negation of this value 
Example: 
~5 == -6 
// in binary: ~00000101 == 
//    11111010 
+0

स्पष्टीकरण और संदर्भ के लिए धन्यवाद। – Jack

16

~ पूर्णांक पर लागू होने पर bitwise नहीं ऑपरेटर है। हेक्स में देखना सबसे आसान है:

scala> "%x".format(~0x7F) 
res0: String = ffffff80 
+2

+1 टूट गया है इस बात की पुष्टि यह बिटवाइज़ ऑपरेटर नहीं है के लिए। जब आपने उत्तर दिया तो मैं बाइनरी स्ट्रिंग को प्रिंट करने के साथ चारों ओर झुका रहा था। क्षमा करें कि मैं केवल एक जवाब स्वीकार कर सकता हूं। – Jack

+2

"सबसे आसान" व्यक्तिपरक हो सकता है ... – FracturedRetina