resumen resueltos kuby johnson estadística estadistica elemental ejercicios scala implicit-conversion

scala - resueltos - estadistica elemental resumen



¿Por qué este tipo de conversión implícita es ilegal? (1)

Ok, vamos a empezar con el principio, ¿por qué falla en el primer caso:

  1. Intenta definir un método implícito que transforma una String en un Int y, para hacerlo, se llama a toInt .
  2. Desafortunadamente, toInt no es parte de la clase String . Por lo tanto, el compilador necesita encontrar un implícito para convertir str en algo que tenga un método toInt:Int .
  3. Afortunadamente, Predef.augmentString convierte un String en un StringOps , que tiene tal método.
  4. Pero el tipo Int también tiene un método de este tipo y AS define un tipo de retorno, el método strToInt2 puede llamarse recursivamente, y como el método es implícito, puede aplicarse para transformar algo con una función toInt:Int
  5. El compilador no sabe qué método implícito usar (entre el suyo y Predef.augmentString y arroja un error.

En el segundo caso, al omitir el tipo de retorno, la función strToInt2 no puede ser recursiva, y ya no hay dos candidatos para transformar la String .

PERO si después de esta definición, intenta: "2".toInt , el error está de vuelta: ahora tienes dos formas de obtener algo con una función toInt:Int cuando tienes una String .

Escribo la siguiente conversión implícita en scala:

implicit def strToInt2(str: String):Int = { str.toInt }

Pero se levanta este error de compilación:

<console>:9: error: type mismatch; found : str.type (with underlying type String) required: ?{val toInt: ?} Note that implicit conversions are not applicable because they are ambiguous: both method augmentString in object Predef of type (x: String)scala.collection. immutable.StringOps and method toi in object $iw of type (str: String)Int are possible conversion functions from str.type to ?{val toInt: ?} str.toInt ^

Si elimino el tipo de retorno, simplemente lo declaro así:

implicit def strToInt2(str: String) = { str.toInt }

Se compila con éxito. ¿Alguien puede decirme cuál es la diferencia entre los dos?