2013-09-10 2 views
4

Во-первых, краткое описание. Похоже, что если я помещу неявный для какого-либо другого типа в объект-компаньон и импортирую его в область видимости класса, он не будет найден во время неявного разрешения, пока он не будет указан явно один раз (или определен выше класса). Пример ниже.Ошибка компилятора Implicits?

class A(val a: Something) 

object A { 
    implicit val default = ... //found by default 
} 

object B { 
    def func(fn: => T)(implicit a: A) = ... 
} 

class Broken { 
    def doSomething = { 
    import Broken._ // or Broken.actual 
    B.func { ... } // Uses A.default, not Broken.actual for implicit 
    } 
} 

object Broken { 
    implicit val actual = ... 
} 

class Fixed { 
    def doSomething = { 
    import Fixed._ 
    println(actual) //reference actual 
    B.func { ... } // uses Fixed.actual 
    } 
} 

object Fixed { 
    implicit val actual = ... 
} 

object WTF { 
    implicit val actual = ... 
} 

class WTF { 
    def doSomething = { 
    import WTF._ 
    B.func { ... } // With object definition first this works without referencing actual 
    } 
} 

Я вроде предполагая, на данный момент я нашел ошибку компилятора, поэтому я открою JIRA против Scala, но в то же время мне интересно, если кто-нибудь здесь знает, если это, как ожидается, , или если у вас уже есть открытая ошибка?

редактировать: https://issues.scala-lang.org/browse/SI-7830

edit2: удален «: А» Тип декларации от всех фактических и по умолчанию вальса, чтобы правильно воссоздать мой вопрос.

+0

1. Не открывайте проблемы JIRA, прежде чем вы подтвердите, что это настоящая проблема. 2. Можете ли вы опубликовать рабочий пример, демонстрирующий вашу проблему? Потому что я просто попытался вставить некоторые значения, и он работал, как ожидалось. http://ideone.com/oELulq –

+0

Хорошо стреляйте, здесь есть одна разница между тем, что я опубликовал, и моим фактическим кодом. Если вы удалите: A из всех фактических объявлений и объявлений по умолчанию, это теперь работает, как я описал выше. –

+0

http://ideone.com/1Vtepf для выпуска –

ответ

3

Извините, это «как указано» в той мере, в какой существует спецификация. «Спецификация» похоронена в комментариях билета от пяти лет назад. https://issues.scala-lang.org/browse/SI-801

+0

Хм, так что я видел нечто похожее на то, что у меня есть. Есть примеры того, что «это не скомпилируется», что является проблемой, если я беру неявный дефолт из A выше. Моя проблема довольно коварна, хотя, если у меня есть значение по умолчанию, которое она находит, моя программа компилируется и, по-видимому, работает! Может быть, с моим примером это будет рассмотрено, но кто знает. –

+0

@WilliamThurston Это предупреждение о неоднозначных имплицитах (или что-то еще), где говорится, что «такое-то не применяется, потому что оно приходит позже и не имеет явного типа результата». Поэтому обычно я всегда пишу тип результата, но, честно говоря, это не перешло мне в голову, когда я рассматривал эту проблему. (Я должен сказать: «... мой разум, что осталось от него».) С другой стороны, я чувствую головоломку. Ошибки Scala приходят и уходят, но загадки на века. –

+0

К сожалению, похоже, это ожидается, как вы указали. Я даже не получаю предупреждение о компиляторе либо из того, как код написан выше, хотя :(Может быть, когда-нибудь я посмотрю на внутренности Scala и оправдую себя, почему это должно быть так. Учитывая, что Джира была закрыто, я думаю, мне просто нужно иметь дело с этим. –

Смежные вопросы