Ответ 1
В отличие от это объяснение, Scala анализирует println(1,2)
(или Console println (1,2)
, если на то пошло) так же, как он разбирает любой вызов метода с двумя аргументами. Позже компилятор преобразует вызов, обертывая аргументы метода в кортеже, чтобы соответствовать фактической сигнатуре типа метода.
Если компилятор этого не сделал, вполне допустимые выражения типа Console println (1,2)
не скомпилировались, потому что println
не принимает несколько аргументов. Для этого поведения существуют другие допустимые варианты использования.
Рассмотрим выражение типа foo bar (1,2)
с точки зрения компилятора, имея в виду, что Scala имеет специальный синтаксис, который позволяет отказаться от вызовов .
и вызова parens on. Это может быть вызов метода с двумя аргументами bar
с аргументами 1
и 2
, или он может быть вызовом метода с одним аргументом bar
с одним аргументом, заданным по tuple. Парсер ничего не знает о методе bar
, поэтому он просто анализирует вызов метода с двумя аргументами.
Во время фазы проверки типов предположим, что компилятор определяет, что foo
не имеет метода с двумя аргументами bar
, но имеет метод с одним аргументом bar
, подпись которого совместима с интерпретацией кортежа. Поскольку нет другой достоверной интерпретации, она предполагает, что это то, что вы имели в виду, и преобразует два аргумента в кортеж. Обратите внимание, что если существует метод с двумя аргументами bar
, даже тот, который несовместим с фактическими аргументами, typer не будет выполнять преобразование с автоматическим tupling.