स्व-प्रकार के एनोटेशन में इसके और स्व के बीच अंतर?


134

विभिन्न स्काला साहित्य में मुझे "यह" और अन्य "स्व" का उपयोग करते हुए कुछ प्रकार के एनोटेशन मिलते हैं।

trait A { this: B => ... }
trait A { self: B => ... }

क्या "यह" या "स्व" का उपयोग करने के बीच कोई वास्तविक अंतर है? क्या यह बिल्कुल मायने रखता है कि आप किस नाम का उपयोग करते हैं? क्या यह उतना ही मान्य है?

trait A { foo: B => ... }

जवाबों:


181

सभी तीन रूप मान्य हैं, और इसका प्रभाव वर्ग Bके प्रकार के रूप में माना जाता है ।thisA

पहले दो वेरिएंट

trait A { self: B => ... }
trait A { foo: B => ... }

विशेषता में एक उपनाम के रूप में self(क्रमशः foo) परिचय । यह एक आंतरिक वर्ग से संदर्भ तक पहुँचने के लिए उपयोगी है । यानी तब आप तब उपयोग कर सकते हैं जब किसी वर्ग से इसके संदर्भ का उपयोग करते हुए इसके भीतर नेस्टेड हो। उदाहरण:thisAthisselfA.thisthisA

class MyFrame extends JFrame { frame =>    
  getContentPane().add( new JButton( "Hide" ) {
    addActionListener( new ActionListener {
      def actionPerformed( e: ActionEvent ) {
        // this.setVisible( false ) --> shadowed by JButton!
        frame.setVisible( false )
      }
    })
  })
}

तीसरा संस्करण,

trait A { this: B => ... }

के लिए एक उपनाम पेश नहीं करता है this; यह सिर्फ आत्म प्रकार सेट करता है।


जिस तरह से मैं आत्म प्रकार को देखता हूं वह यह है कि विशेषता ने खुद को एक निश्चित प्रकार लेने और कोड ब्लॉक को वापस करने की घोषणा की जैसे कि foo: B => {...}। अब वे धाराएँ निश्चित रूप से छोड़ी गई हैं। यह देखना दिलचस्प है कि आप कोड में किसी भी दायरे के अंदर "इस" के बजाय ऑब्जेक्ट नाम का उपयोग कर सकते हैं, हालांकि [कुछ ऐसा जो हम पूरे समय जावास्क्रिप्ट में करते हैं]
उस्मान संगत

4
@ मर्टिन ओडस्की दो या दो से अधिक लक्षणों के लिए प्रतिबंध जोड़ना संभव है, कुछ ऐसा trait A { self: B, C => ... }?
दिमित्री बेस्पालोव

13
@DmitryBespalov: हाँ, आप withस्व-टाइपिंग एनोटेशन में कीवर्ड का उपयोग कर सकते हैं । उदाहरण के लिएtrait A { self: B with C => ... }
डेव

btw आप _: B =>सादगी के लिए गैर-उर्फ मामले के लिए भी कर सकते हैं
Creos

17

इसमें अंतर है कि thisहमेशा अंतरतम टेम्पलेट द्वारा परिभाषित वस्तु को संदर्भित करता है।

अभिव्यक्ति thisटेम्पलेट या यौगिक प्रकार के कथन भाग में दिखाई दे सकती है। यह ऑब्जेक्ट को अंतरतम टेम्पलेट या यौगिक प्रकार द्वारा परिभाषित किया जा रहा है जो संदर्भ को घेर रहा है। यदि यह एक यौगिक प्रकार है, तो उस प्रकार का thisयौगिक है। यदि यह सरल नाम C के साथ वर्ग या ऑब्जेक्ट की परिभाषा का टेम्पलेट है , तो इसका प्रकार C के प्रकार के समान हैthis। (स्काला रेफरी। .56.5)

इसलिए, यदि आप अपने स्व-प्रकार को कॉल करते हैं, तो आप fooअभी भी इसे संदर्भित कर सकते हैं this(जब तक, निश्चित रूप से, आप एक आंतरिक टेम्पलेट में हैं, जिसमें मामला thisइसके द्वारा परिभाषित वस्तु का संदर्भ देगा - और जब तक आप आंतरिक नहीं देते टेम्प्लेट का सेल्फ-टाइप एक ही नाम है) लेकिन स्पष्ट रूप से दूसरा तरीका नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.