Неявный вопрос для новичков в Scala выглядит следующим образом: где компилятор ищет implicits? Я подразумеваю подразумеваемый, потому что вопрос никогда не кажется полностью сформированным, как будто для этого не было слов.:-) Например, где значения для integral
приведены ниже?
scala> import scala.math._
import scala.math._
scala> def foo[T](t: T)(implicit integral: Integral[T]) {println(integral)}
foo: [T](t: T)(implicit integral: scala.math.Integral[T])Unit
scala> foo(0)
[email protected]
scala> foo(0L)
[email protected]
Еще один вопрос, который следует за теми, кто решил узнать ответ на первый вопрос, заключается в том, как компилятор выбирает, что имплицитно использовать, в определенных ситуациях кажущейся двусмысленности (но это компилируется в любом случае)?
Например, scala.Predef
определяет два преобразования из String
: один в WrappedString
, а другой - StringOps
. Однако оба класса имеют множество методов, поэтому почему Scala не жалуется на двусмысленность, если, например, вызывает map
?
Примечание: этот вопрос был вдохновлен этим другим вопросом в надежде сформулировать проблему более общим образом. Пример был скопирован оттуда, потому что в ответе указывается.