2013-05-14 9 views
9

Ben onlar büyük yük olmaksızın (umarım) bazı ilkel türleri zenginleştirmek ve tip-güvenli kalmak bana sağlayacak çünkü benim projelerin birine Scala'nın değer sınıfları uygulamak istiyoruz.Gizli değer sınıflarındaki miras, bir ek yük getiriyor mu?

object Position { 

    implicit class Pos(val i: Int) extends AnyVal with Ordered[Pos] { 

    def +(p: Pos): Pos = i + p.i 

    def -(p: Pos): Pos = if (i - p.i < 0) 0 else i - p.i 

    def compare(p: Pos): Int = i - p.i 

    } 
} 

Benim soru : Onları her kullandığınızdaOrdered miras (böylece büyük bir yükü tanıtmak) olmadığını Pos nesnelerin tahsisini zorlamak mı? Eğer öyleyse: Bunu atlatmanın bir yolu var mı?

cevap

6

her şey Pos bir Ordered[Pos] olarak kabul edilecektir, ayırma olur. Atama gerçekleşmesi gerektiğinde birkaç durum vardır, bkz. http://docs.scala-lang.org/overviews/core/value-classes.html#when_allocation_is_necessary. < çağırma olarak basit bir şey yaparken

Yani, tahsisleri alacak:

val x = Pos(1) 
val y = Pos(2) 
x < y // x & y promoted to an actual instance (allocation) 

ilgili kurallar (yukarıdaki makaleden alıntı) vardır:

bir değer sınıfı tedavi edilir zaman evrensel özellik dahil olmak üzere başka bir tür olarak, gerçek değer sınıfının bir örneğidir örneği ve gereken: bir değer sınıfı, tip değişken olarak kullanıldığı zaman, bu kuralın başka örneğidir. Yukarıdaki kod parçacığını Disassembling

bu doğruluyor:

0: aload_0 
1: iconst_1 
2: invokevirtual #21     // Method Pos:(I)I 
5: istore_1 
6: aload_0 
7: iconst_2 
8: invokevirtual #21     // Method Pos:(I)I 
11: istore_2 
12: new   #23     // class test/Position$Pos 
15: dup 
16: iload_1 
17: invokespecial #26     // Method test/Position$Pos."<init>":(I)V 
20: new   #23     // class test/Position$Pos 
23: dup 
24: iload_2 
25: invokespecial #26     // Method test/Position$Pos."<init>":(I)V 
28: invokeinterface #32, 2   // InterfaceMethod scala/math/Ordered.$less:(Ljava/lang/Object;)Z 
biz sınıfta Position$Pos için "yeni" işlem kodu iki örneğini

GÜNCELLEME var görülebilir

: önlemek için el (bile onlar sadece ileriye Originlal uygulanmasına) her yöntemi geçersiz kılabilirsiniz böyle simpleks durumlarda tahsisi:

Örneğin tarafından x < y yaparken

Butahsisi kaldıracaktır. Ancak, bu durum hala Pos'un Ordered[Pos] (Ordered[Pos] veya bir Ordered[T] türünde T türünde bir parametre olarak alınmış bir yönteme geçtiğinde) olarak ele alındığında durumları bırakır. Bu özel durumda, hala bir tahsis olacak ve bunun etrafında hiçbir yolu yoktur.

+0

Sen tahsisini önlemek bir Pos karşılaştırılabilir hale getirmek için herhangi bir yol biliyor? – peri4n

+0

Lütfen güncellememi kontrol edin. –

+0

Çok teşekkür ederim – peri4n

İlgili konular