Мое понимание - Unit
= void
, но почему я могу передать несколько аргументов?Почему действует следующий код scala?
Так может кто-нибудь объяснить, почему действует следующий код?
def foo(x: Unit) = println("foo")
foo("ss", 1)
Мое понимание - Unit
= void
, но почему я могу передать несколько аргументов?Почему действует следующий код scala?
Так может кто-нибудь объяснить, почему действует следующий код?
def foo(x: Unit) = println("foo")
foo("ss", 1)
Если вы ведете свой сниппет с 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.
Я не вижу достаточной причины для такого поведения, и я предпочел бы получить вместо него ошибку компилятора.
Если вы определяете 'foo (x: (String, Int)), то вы можете вызвать его, как указано выше, с помощью пары аргументов, которые автоматически загружаются. Поскольку для «Unit» может быть передано что-либо, кажется, что преобразование кортежей подходит именно так, как вы продемонстрировали. Я тоже не уверен, что мне это нравится, но, возможно, вина в том, что авто-tupling вообще? –
Родственный вопрос, который дает достойный ответ на это здесь:
Scala: Why can I convert Int to Unit?
Из раздела 6.26.1 на Scala Language Specification v2.9, "Value отбрасывания":
Если е имеет некоторые тип значения и ожидаемый тип - Unit, e преобразуется в ожидаемый тип, вставляя его в член {e;()}.
Таким образом, в вашем случае это кажется («сс», 1) преобразовывается в кортеж, так что его можно рассматривать как один аргумент, то, как аргумент типа не блок, он преобразуется в блок, который вычисляет это значение кортежа, затем возвращает единицу для соответствия требуемому типу параметра.
Почему вы создаете параметр типа Unit? Если вам не нужен параметр, просто выполните 'def foo()'. – sourcedelica