2012-03-07 21 views
6

sırası karşılaştığım ne bir sadeleştirme. Bu derler:Implicits ve İşte beyanı

trait A { implicit val x = 1 } 
trait B extends A { val y = implicitly[Int] } 

bu yok iken (örtük değerini bulamadım):

trait B extends A { val y = implicitly[Int] } 
trait A { implicit val x = 1 } 

Ben kendi kendine türünü belirterek net Niyetimi yapmaya çalıştım: trait A { this: B => ... }, ama boşuna .

nasıl kod nasıl yerleştirildiğine önemsemeden ben bağımlılıkları bu tür başa do?

cevap

11

En az örtük görünürlük kuralları kendi türü explicitely veya olmasın bildirilmiş olsun farklıdır ikincisi biri

trait B extends A { val y = implicitly[Int] } 
trait A { implicit val x : Int = 1 } 

için, açıkça türü bildirmek gerekir. Öyle değilse, örtük, yalnızca bildirimin yapıldığı noktadan sonra (dolaylı olarak) kullanılabilir.

neden türünü (özyinelemeli rutin olduğu gibi) ilan olmasaydı tür kesmesi çok zor hale gelebilir olmasıdır. Çoğu durumda, çıkarım kolay olurdu (kodunuzda olduğu gibi), ancak spesifikasyonun açık bir şekilde kesilmesi gerekir.

+0

ne örtük nesneler hakkında? Bana dolaylı kararların çözümü ile ilgili bölümlerin bölümlerini işaret edebilir misiniz? X özelliği; B özelliği A {val y = implicitly [X]}; Bir ' – elbowich

+1

yazık geç cevap {kapalı nesnenin x X uzanır} trait. Spekülasyonda daha fazla gösterişli bir bakıştan sonra, kuralı bulamadım. O uygulama yaptığı iştir gibi [bu hata raporu] (https://issues.scala-lang.org/browse/SI-801), bak içinde ancak bahsettiğimde, ancak henüz spec bunu yapmadı. Neden örtülü bir nesne ile çalışmaması gerektiğini anlamıyorum. –