Я новичок в Scala и пытаюсь разобраться в неявном волшебстве. Я хочу понять, почему я получаю 2mysize с функцией + и 2 * длиной для функции *?

   implicit def addToStr(str: String) = str.size


    scala> 2 * "mysize"

    res4: Int = 12

    scala> 2 + "mysize"

    res3: String = 2mysize
0
tintin 14 Сен 2018 в 12:09

2 ответа

Лучший ответ

Взгляните на страницу ScalaDocs для Int API. Класс Int имеет метод +() для добавления String.

abstract def +(x: String): String

Но у него нет метода *() для умножения String. Компилятор всегда будет выбирать определенную функцию / метод вместо неявной. Он будет искать неявное решение только в крайнем случае.

5
jwvh 14 Сен 2018 в 09:35

Неявные преобразования применяются, только если выражение не соответствует типу аргумента функции.

Примере:

import scala.language.implicitConversions
implicit def strToInt(s: String):Int = s.size
def printStr(s: Int):Unit = {
  println(s"Printing Int ${s}")
}

printStr("SSSS")

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

def printStr(s: String) = {
  println(s"Printing String ${s}")
}

Он будет автоматически использовать этот метод, а не неявные разрешения. https://www.scala-lang.org/old/node/3911. HTML

1
Shankar Shastri 14 Сен 2018 в 09:48