2012-10-12 2 views
9

Мое понимание - Unit = void, но почему я могу передать несколько аргументов?Почему действует следующий код scala?

Так может кто-нибудь объяснить, почему действует следующий код?

def foo(x: Unit) = println("foo")     
foo("ss", 1) 
+2

Почему вы создаете параметр типа Unit? Если вам не нужен параметр, просто выполните 'def foo()'. – sourcedelica

ответ

19

Если вы ведете свой сниппет с scala -print вы примерно получите следующий результат для кода:

/* Definition of foo */ 
private def foo(x: scala.runtime.BoxedUnit): Unit = { 

/* Invocation of foo */ 
foo({ 
    new Tuple2("ss", scala.Int.box(1)); 
    scala.runtime.BoxedUnit.UNIT 
}); 

Как вы можете видеть, аргументы foo переписаны в блоке кода, который создает кортеж, но затем возвращает UNIT.

Я не вижу достаточной причины для такого поведения, и я предпочел бы получить вместо него ошибку компилятора.

+2

Если вы определяете 'foo (x: (String, Int)), то вы можете вызвать его, как указано выше, с помощью пары аргументов, которые автоматически загружаются. Поскольку для «Unit» может быть передано что-либо, кажется, что преобразование кортежей подходит именно так, как вы продемонстрировали. Я тоже не уверен, что мне это нравится, но, возможно, вина в том, что авто-tupling вообще? –

5

Родственный вопрос, который дает достойный ответ на это здесь:

Scala: Why can I convert Int to Unit?

Из раздела 6.26.1 на Scala Language Specification v2.9, "Value отбрасывания":

Если е имеет некоторые тип значения и ожидаемый тип - Unit, e преобразуется в ожидаемый тип, вставляя его в член {e;()}.

Таким образом, в вашем случае это кажется («сс», 1) преобразовывается в кортеж, так что его можно рассматривать как один аргумент, то, как аргумент типа не блок, он преобразуется в блок, который вычисляет это значение кортежа, затем возвращает единицу для соответствия требуемому типу параметра.

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