Здесь есть документация о Predef
, но нет слова об идентификаторе. Для чего предназначена эта функция? И что он делает?
Что делает Predef.identity в scala?
Ответ 1
Это просто экземпляр функции идентификации, предопределенный для удобства, и, возможно, для того, чтобы люди не переопределяли его самостоятельно целую кучу раз. identity
просто возвращает свой аргумент. Иногда бывает полезно перейти к функциям более высокого порядка. Вы можете сделать что-то вроде:
scala> def squareIf(test: Boolean) = List(1, 2, 3, 4, 5).map(if (test) x => x * x else identity)
squareIf: (test: Boolean)List[Int]
scala> squareIf(true)
res4: List[Int] = List(1, 4, 9, 16, 25)
scala> squareIf(false)
res5: List[Int] = List(1, 2, 3, 4, 5)
Я также видел, что время от времени оно использовалось как значение аргумента по умолчанию. Очевидно, вы могли бы просто сказать x => x
любое место, где вы могли бы использовать identity
, и вы даже сохранили бы пару символов, поэтому он не купит вас много, но он может быть самодокументирован.
Ответ 2
Кроме того, что уже упоминалось acjay, функция Identity чрезвычайно полезна в сочетании с неявными параметрами.
Предположим, что у вас есть такая функция:
implicit def foo[B](b: B)(implicit converter: B => A) = ...
В этом случае функция Identity будет использоваться как неявный преобразователь, когда какой-либо экземпляр B <: A передается как первый аргумент функции.
Если вы не знакомы с неявными преобразованиями и как использовать неявные параметры для их цепочки, прочитайте следующее: http://docs.scala-lang.org/tutorials/FAQ/chaining-implicits.html