Почему я не могу вставлять скрытые звонки - PullRequest
0 голосов
/ 25 апреля 2019

Скажите, у меня есть следующее:

class A {
    def foo() = { println("foo") }
}

case class B(a: A)

implicit def toA(b: B) = b.a

implicit def wrapper(a: A) = new {
    def bar() = a.foo()
}

Тогда я не могу сделать следующее:

val b = B(new A())
b.bar() // cannot resolve

Скорее мне нужно явно вызывать toA () неявным:

toA(b).bar()

или сделать

(b: A).bar()

Почему компилятор не знает, как применить первое неявное значение перед тем, как применить второе неявное, упаковщик?

1 Ответ

2 голосов
/ 26 апреля 2019

Правило по одному: пробуется только одно неявное. Компилятор никогда не переписывает x + y в convert1(convert2(x)) + y. Это привело бы к значительному увеличению времени компиляции в ошибочном коде и увеличило бы разницу между тем, что пишет программист, и тем, что фактически делает программа. Ради здравого смысла, компилятор не вставляет дальнейшие неявные преобразования, когда он уже пытается найти другое неявное. Однако это ограничение можно обойти, если косвенные параметры принимают неявные параметры, что будет описано далее в этой главе.

Раздел 21.2 Правила для имплицитов , из Программирование на Scala, Первое издание Мартина Одерского, Лекса Спуна и Билла Веннерса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...