Подчеркнуть в названных аргументах - PullRequest
13 голосов
/ 10 марта 2011

Может кто-нибудь объяснить мне, что именно здесь происходит? Я не до конца разбираюсь в этом:

val s = Seq(1D,2D,3D,4D)
case class WithUnit(value: Double, unit: String)
s map { WithUnit(_,"cm") } // works
s map { WithUnit(value = _ , unit = "cm") } // error: missing parameter type for expanded function ((x$2) => value = x$2)

Полагаю, компилятор не может определить тип параметра, потому что я написал имя аргумента. Но почему нет? Это не должно быть сложнее только из-за указания имени аргумента?!

Спасибо!

Ответы [ 2 ]

29 голосов
/ 10 марта 2011

Когда вы написали:

 WithUnit(value = _, unit = "cm")

Вы хотели, чтобы это значило:

 x => WithUnit(value = x, unit = "cm")

Но если вы внимательно посмотрите на сообщение об ошибке, вы увидите, что компилятор не видел его таким образом, он проанализировал его как:

 WithUnit(x => value = x, unit = "cm"})

Как видите, _ ограничена более плотно, чем вы хотели.

_ всегда выбирает самую узкую невырожденную область видимости, какую только может. Область видимости определяется чисто синтаксически при синтаксическом анализе, без учета типов.

Под невырожденным я имею в виду, что компилятор не думал, что вы имели в виду:

WithUnit(value = x => x, unit = "cm")

Самая узкая невырожденная область действия означает область, определенную самой внутренней скобкой функции относительно подчеркивания. Без такого правила компилятор не мог бы знать, какой _ соответствует какой функции при вложенных вызовах функций.

3 голосов
/ 10 марта 2011

Попробуйте это:

scala> val withUnits = s map { x => WithUnit(value = x, unit = "cm") }
withUnits: Seq[WithUnit] = List(WithUnit(1.0,cm), WithUnit(2.0,cm), WithUnit(3.0,cm), WithUnit(4.0,cm))

Проблема заключается в использовании подчеркивания для непосредственного определения произвольной функции.

Подробное описание в главе 8.5. Синтаксис заполнителя в книге «Программирование в Scala» .

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