2011-05-15 12 views
8

Aşağıdaki neden çalışmıyor? (Evet, 2.9.0final ile çalışan ve üzerine "-Xexperimental" seçeneğini döndü ediyorum.)Herhangi Birinden Dinamik'e Kapalı Dönüştürme

implicit def any2Dynamic(a: Any) = new Dynamic { 
    def applyDynamic(name: String)(args: Any*) = { 
    println(a + name) 
    } 
} 

"Say".hello // value hello is not a member of java.lang.String 

One Bunun ne kadar anlamlı tartışabiliriz ... beklendiği gibi bu işe istiyorsanız neyi Öncelik "Say".toInt: StringLike.toInt veya (new Dynamic {...}).applyDynamic("toInt") adresinde yer alacaktır?

cevap

9

Derleyici, String => { def hello: ? } örtük bir görünüm için ilk looks. Bu başarısız olursa String <: Dynamic ise checks. Bunlar birleştirilmemiş.

Bu dinamik uygulama özelliği henüz tamamlanmamıştır - Scala 2.9.0'da deneyseldir ve değiştirilebilir. Ama böyle bir örtülü olduğu gibi, bu tür bir güvenlik, pencereden dışarı attığınız gibi, kuşku içerecektir. Yanlış yazılan yöntem adları veya yanlış argüman türleri için hiçbir zaman derleme hatası almazsınız. Kullanım durumunuz nedir?

+1

Güvenliğiniz sağda. Ama örtülü def'i kullanım durumumla kısıtlarsam örtük X2Dynamic (x: X) = yeni X {...} '(benim problemim," X "ile sınırlı güvenlik problemi yazın) bir DSL ile bir dinamik oluşturmak için çağırma, yani örneğin harici olarak xml olarak tanımlanır. Şimdiye kadar aklımda bir deney ... Bu arada, kaynak bağlantıları için teşekkürler! –

+1

Aslında bu tür davranışların harika olduğunu düşünüyorum. Dar bir kapsamda dinamik dil yeteneklerini kullanmanıza izin verebilir. Script veya DSL için harika. – IttayD

+0

@IttayD Ben de;) En azından, SO'da iyi bir soruya verilen karmaşık bir cevap söz konusu olduğunda aklınızda bulundurun. –