Какой экземпляр CanBuildFrom обнаруживает компилятор Scala?
Каждый. Пожалуйста, прости меня за глупый вопрос о Скале. Хотя я программирую в Scala около 2 лет, мне все еще трудно понять implicit
использование. Давайте возьмем пример для обсуждения:
Array(1,2,3,4).map(x => x)
Если вы посмотрите скаляр, вы не можете найти метод map
на Array
учебный класс. Причина того, что map
может применяться на Array(1,2,3,4)
является то, что есть неявная функция implicit def intArrayOps (xs: Array[Int]): ArrayOps[Int]
определяется в scala.Predef
,
Тем не менее, есть два списка параметров, где второй записывается как implicit bf: CanBuildFrom[Array[T], B, That])
, Теперь мне интересно, где компилятор находит правильный аргумент для типа CanBuildFrom
при подаче заявления map
на Array(1,2,3,4)
,
2 ответа
Неявное разрешение включает в себя поиск сопутствующего объекта по типу неявного параметра, а также сопутствующих объектов по типу параметров неявного параметра. В приведенном выше примере подпись карты следующая
def map[B, That](f: (Int) => B)(implicit bf: CanBuildFrom[Array[Int], B, That]): That
Поскольку у нас нет требований к типу для этого, мы можем пока игнорировать это. После того, как мы смотрим в локальную и контейнерную области и не обнаруживаем соответствующих совпадений, следующим местом для поиска неявного объекта будет объект-компаньон для CanBuildFrom. Однако у него нет сопутствующего объекта. Итак, мы продолжим и посмотрим на Array для неявного. Мы находим один в виде
implicit def canBuildFrom[T](implicit m: ClassManifest[T]): CanBuildFrom[Array[_], T, Array[T]]
Поскольку у нас нет требований к типу и неявного соответствия, "That" вынужден иметь тип Array[Int] и завершает нашу типизацию.
На этот вопрос частично ответили другие вопросы о Stackru. Позвольте мне попытаться обобщить их:
Первая часть, которую вам нужно знать, - это то, где компилятор Scala ищет возможные последствия. Вы можете найти более подробную информацию о CanBuildFrom здесь.
Если вы поняли, что упомянуто в ответах о последствиях, вам следует взглянуть на конструкцию Scala Collections. Их иерархия наследования объясняется здесь, а список здесь. Все они построены со строителями. Это подробно объясняется в вопросе о breakOut.
Чтобы собрать свои знания, вы должны знать, как подтолкнуть Коллекции. Кроме того, это объясняется в Stackru в этом вопросе.
Обратите внимание, что лучшие ответы по Stackru обобщены в Scala-Tag-Wiki.