2014-11-03 39 views
6

üzerine derleme hatası aynı temel türü paylaşmak farklı tip takma adları atarken zaman hatası (ya da en azından uyarı) derlemek almanın bir yolu var mı uygula?Scala: tip takma uyumsuzluğu

val city: City = "Dublin" 
foo(city) 

Bildiğim kadarıyla, söyleyebilirim: Ben yaparsam uyarı/bir derleme zamanı hatası almak istiyorum

type Address = String 
type City = String 

def foo(x:Address) = ... 

: Başka bir deyişle

, bu kod var ki derleyici, aynı altta yatan türden olduğundan izin verir. Benim kadarıyla

cevap

4

, tip takma adları için talep bu "tip-güvenlik" elde etmek mümkün değildir. Bununla birlikte, arzu ettiğiniz şey için kullanılabilecek diğer adlar yazmanız için bir alternatif vardır: Value Classes. Temel olarak, bir değer sınıfı, yeni bir nesne tahsis etmeden size bir tip verebilir. Tür takma adlarına sahip olmadığınız sınıflara değer vermek için bazı sınırlamalar olduğunu unutmayın.

Correctness değeri sınıfları için

Başka bir örnek kullanım zamanı ayırma yükü olmadan bir veri türü tür güvenliği elde etmektir:

Scala belgeleri alıntı. gibi

val x = new Meter(3.4) 
    val y = new Meter(4.3) 
    val z = x + y 

olmaz aslında iki mesafeleri ekler

class Meter(val value: Double) extends AnyVal { 
    def +(m: Meter): Meter = new Meter(value + m.value) 
    } 

Kanunu: Örneğin, mesafe temsil eden bir veri türünde bir parçası gibi görünebilir Herhangi bir Metre örneğini tahsis edin, ancak yalnızca ilkel çiftleri çalışma zamanında kullanacaktır.

+0

Değer vaka sınıfları yapabilir miyim? Yeni anahtar kelime kullanım şeklini beğenmedim –

+0

Değer durum sınıflarını tanımlayabilirsiniz. Bu arada: 'yeni'-anahtar kelimesini çıkarmanızın sebebi (oluşturulan) tamamlayıcı nesnenin 'apply'-method'udur, bu nedenle anahtar kelimeden kurtulmak için mutlaka bir vaka sınıfı tanımlamanız gerekmez. –

+0

Evet Biliyorum, tüm tür takma adlar için kendi yoldaşlarımı tanımlamamayı tercih ediyorum, uzun ve sıkıcı^_ ^ –

3

sayılı En azından, derleyici değiştirmeden (o bir derleyici eklenti, hatta bir makro ile mümkün olabilir) değil ve daha sonra bu değişikliği halk kütüphaneleri bir çok yapılan if (standardını dahil kütüphane) ve standart kod örnekleri derlenmez.

Kulu cevabı @ anlatıldığı gibi, değer sınıfları kullanmak isteyebilirsiniz. Alternatif olarak, Scalaz Tagged Types, daha fazla durumda (örneğin, bir koleksiyona koyma veya etiketli bir tip kullanan jenerik bir türün güvenli bir şekilde yayınlanması için subst kullanılarak) daha fazla yükten kaçınır.