2010-06-25 17 views
47

सी # में आप लिख सकते हैं:सी # के विस्तार विधियों के बराबर स्कैला?

using System.Numerics; 
namespace ExtensionTest { 
public static class MyExtensions { 
    public static BigInteger Square(this BigInteger n) { 
     return n * n; 
    } 
    static void Main(string[] args) { 
     BigInteger two = new BigInteger(2); 
     System.Console.WriteLine("The square of 2 is " + two.Square()); 
    } 
}} 

कैसे इस सरल extension method नज़र स्काला में चाहते हैं?

उत्तर

60

Pimp My Library पैटर्न अनुरूप निर्माण है:

object MyExtensions { 
    implicit def richInt(i: Int) = new { 
    def square = i * i 
    } 
} 


object App extends Application { 
    import MyExtensions._ 

    val two = 2 
    println("The square of 2 is " + two.square) 

} 

प्रति @Daniel Spiewak की टिप्पणी, इस विधि मंगलाचरण पर प्रतिबिंब सहायता प्रदर्शन से दूर रहेंगे,:

object MyExtensions { 
    class RichInt(i: Int) { 
    def square = i * i 
    } 
    implicit def richInt(i: Int) = new RichInt(i) 
} 
+28

चेतावनी: 'नई {...}' वाक्य रचना, आप वास्तव में 'richInt' विधि के लिए एक संरचनात्मक प्रकार अनुमान लगाने के लिए संकलक के कारण कर रहे हैं, जिसका अर्थ है का उपयोग करके कि प्रतिबिंब (एक प्रदर्शन हत्यारा) का उपयोग करके 'वर्ग' का कोई भी आमंत्रण किया जाएगा। 'RichInt' वर्ग को परिभाषित करना बेहतर होगा जो' वर्ग' को परिभाषित करता है और 'richInt' विधि से वापस आ जाता है। –

+0

@Daniel, क्या आप उस कोड को पोस्ट कर सकते हैं जिसका आप वर्णन कर रहे हैं? – OscarRyz

+4

@ समर्थन 'क्लास RichInt (i: Int) {def square = i * i} '' MyExtensions' में जोड़ें और 'richInt' विधि पर 'नया RichInt (i)' करें। –

3

स्काला में हम का उपयोग तथाकथित (भाषा के आविष्कारक द्वारा) मेरी लाइब्रेरी पैटर्न पंप करें, जो बहुत अधिक चर्चा और सुंदर है यदि आप एक स्ट्रिंग (कीवर्ड नहीं) खोज का उपयोग करते हैं, तो वेब पर खोजने के लिए sy।

9

यह डैनियल के comment के बाद कोड होगा।

object MyExtensions { 
    class RichInt(i: Int) { 
     def square = i * i 
    } 
    implicit def richInt(i: Int) = new RichInt(i) 

    def main(args: Array[String]) { 
     println("The square of 2 is: " + 2.square) 
    } 
} 
45

स्काला के संस्करण 2.10 के बाद से, यह एक पूरी क्लास अंतर्निहित रूपांतरण के लिए योग्य बनाने के लिए संभव है

implicit class RichInt(i: Int) { 
    def square = i * i 
} 

इसके अलावा, यह यह होने से एक्सटेंशन प्रकार का उदाहरण बनाकर से बचने के लिए संभव है AnyVal

implicit class RichInt(val i: Int) extends AnyVal { 
    def square = i * i 
} 

विस्तार निहित वर्गों और AnyVal, सीमाओं और विचित्रता के बारे में अधिक जानकारी के लिए, आधिकारिक दस्तावेज:

+0

ध्यान दें कि केस क्लास ** ** को 'निहित' कीवर्ड के साथ एनोटेट नहीं किया जा सकता है, क्योंकि उनके पास ऑटो-जेनरेटेड साथी ऑब्जेक्ट है। अधिक जानकारी के लिए @megri द्वारा प्रदान किए गए दस्तावेज़ लिंक देखें। – falconepl

संबंधित मुद्दे