В Scala, если у вас есть выражение, содержащее знак подчеркивания, это анонимная функция с выражением как его тело и подчеркивание как его параметр, например. 2 * _ - анонимная функция, которая удваивает аргумент. Но как далеко простирается тело функции? Мне не хватает четкого правила здесь, что устраняет неоднозначность таких случаев, как например. следующее (проверено с Scala 2.11.7 РЕПЛ):Какой код содержит тело анонимной функции Scala с символом «_» (подчеркивание)?
scala> (_: Int)+2-1 // function body up to 1 - OK
res7: Int => Int = <function1>
scala> ((_: Int)+2)-1 // function body up to 2, - applied to function is an error
<console>:11: error: value - is not a member of Int => Int
((_: Int)+2)-1
^
В то время как вопрос не является дубликатом, принятый ответ на вопрос может быть применен непосредственно к этому вопросу: http://stackoverflow.com/questions/2173373/scala-foreach-strange-behaviour – sschaef
Да, вопрос вы цитата отвечает на мой вопрос, говоря: «... правила расширения _. Он расширяется до самого внутреннего разделителя выражений (скобки или фигурные скобки)». Я могу только надеяться, однако, что эта цитата действительно содержит всю историю, так как я не совсем уверен, что эта цитата эквивалентна выражению spec «(2)», как цитирует Алексей Романов ниже (см. Мой комментарий там). Тем не менее, я бы принял ваш ответ как (надеюсь,!) Правильно, если бы можно было принять комментарий ;-) –
Некоторые случаи, когда вам нужно быть осторожными с этим определением: 1. Он может расширяться дальше, чем ближайшие скобки/фигурные скобки: 'foo (1, _)', но в этом случае они не ограничивают 'Expr'. 2. В 'foo (_)' круглые скобки _do_ разграничить 'Expr', но он состоит только из самого раздела подчеркивания, и вам нужно посмотреть снаружи. 3. '=', '=>', ';', новая строка и ключевые слова, которые вы можете видеть вокруг 'Expr' в грамматике, также могут служить разделителями выражений. –