Lo entiendo es Unit
= void
, pero ¿por qué puedo pasar varios argumentos?¿Por qué el siguiente código scala es válido?
¿Puede alguien explicar por qué el siguiente código es válido?
def foo(x: Unit) = println("foo")
foo("ss", 1)
Lo entiendo es Unit
= void
, pero ¿por qué puedo pasar varios argumentos?¿Por qué el siguiente código scala es válido?
¿Puede alguien explicar por qué el siguiente código es válido?
def foo(x: Unit) = println("foo")
foo("ss", 1)
Si ejecuta el fragmento con scala -print
obtendrá más o menos la siguiente salida para el código:
/* 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
});
Como se puede ver, los argumentos a foo
se vuelven a escribir en un bloque de código que crea una tupla pero luego devuelve UNIDAD.
No puedo ver una buena razón para este comportamiento y prefiero obtener un error de compilación en su lugar.
Si define 'foo (x: (String, Int))', puede llamarlo como se muestra arriba con un par de argumentos, que se agrupan automáticamente. Dado que cualquier cosa puede pasarse por 'Unidad ', parece que la conversión de tupla es apropiada exactamente de la manera que lo ha demostrado. No estoy seguro de que me guste tampoco, pero tal vez la falla radica en el auto-tupling en general? –
Una cuestión relacionada que le da una respuesta decente a esto está aquí:
Scala: Why can I convert Int to Unit?
De la Sección 6.26.1 de la Scala Language Specification v2.9, "Valor descarte":
Si E tiene alguna tipo de valor y el tipo esperado es Unidad, e se convierte al tipo esperado incrustándolo en el término {e;()}.
Así, en su caso parece ("ss", 1) se está convirtiendo en una tupla para que pueda ser tratado como un solo argumento, entonces como que tipo de argumento no es unitario, que se convierte en un bloque que calcula ese valor de tupla y luego devuelve la unidad para que coincida con el tipo requerido del parámetro.
¿Por qué está creando un parámetro de tipo Unidad? Si no quiere un parámetro, simplemente haga 'def foo()'. – sourcedelica