2010-06-25 22 views
47

yazabilirsiniz:C# 's uzantısı yöntemleri Scala eşdeğeri? C# '

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()); 
    } 
}} 

Nasıl olur Scala gibi bu basit extension method görünüyor?

cevap

60

Pimp My Library desen benzer bir yapıdır:

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) 

} 

Başına @Daniel Spiewak yorumları, bu, yardım performansını yöntem çağırma üzerinde yansıma önleyecektir : Biz Scala yılında

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

Uyarı "kare" nin herhangi bir çağrısı, yansıtma (bir performans katili) kullanılarak yapılacaktır. 'Square'i tanımlayan ve' richInt 'yönteminden döndürülen bir "RichInt" sınıfı tanımlamak daha iyi olurdu. –

+0

@Daniel, açıkladığınız kodu gönderebilir misiniz? – OscarRyz

+4

@Support RichInt (i: Int) sınıfını ekle {def square = i * i} 'MyExtensions 've' richInt' yönteminde 'new RichInt (i)' yap. –

3

kullanmak sözde (dilin mucidi tarafından) Pimp Kütüphanem desen, çok tartışılan ve oldukça ea dize (anahtar kelime değil) arama kullanıyorsanız, Web'de bulmak için sy.

9

Bu, Daniel'in comment'dan sonraki kod olacaktır. Scala versiyon 2.10 yana

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

, örtük dönüşüm için tüm sınıf uygun yapmak mümkündür

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

Buna ek olarak, bu olan uzantı türü örneği oluşturma önlemek mümkündür danışmak, örtük sınıflar ve AnyVal, sınırlamalar ve tuhaflıklar hakkında daha fazla bilgi için resmi belgelerine AnyVal

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

uzatmak:

`Yeni {...}` sözdizimi, aslında `richInt` yöntem için yapısal bir türünü tahmin etmek derleyici neden oluyorlarsa, anlam kullanarak:
+0

Vaka sınıfları **, otomatik olarak oluşturulan tamamlayıcı nesneye sahip oldukları için, 'implicit' anahtar kelimesiyle açıklanamaz. Daha fazla bilgi için @megri tarafından sağlanan dokümantasyon bağlantılarına bakınız. – falconepl