Что означает _ :: в Scala? - PullRequest
       8

Что означает _ :: в Scala?

7 голосов
/ 10 января 2012

Я просматриваю книгу «Поднимись в действии» и столкнулся с чем-то, чего я не совсем понимаю: _ ::

object permanent_link extends MappedString(this, 150){
    override def validations =
    valMinLen(3, "Link URL must be at least 5 characters") _ ::
    super.validations
}

Я не могу найти подсказки, поэтому ябыл бы признателен, если бы кто-нибудь мог мне помочь ..

Ответы [ 3 ]

18 голосов
/ 10 января 2012

Я не знаю, Лифт, но это общий вопрос.Прежде всего, :: является оператором аргументов Scala:

scala> 1 :: 2 :: List(3, 4)
res0: List[Int] = List(1, 2, 3, 4)

Это означает, что super.validations является некоторой разновидностью последовательности, а valMinLen(3, "Link URL must be at least 5 characters") _ является единственным значением в этом списке.

Из контекста становится очевидным, что в переопределенном методе validations, который они вызывают super version и , в начале добавляется дополнительная проверка.

Эта дополнительная проверка создаетсязвонок на valMinLen().Однако этот дополнительный вызов возвращает не элемент, соответствующий типу списка validations, а функцию.Вместо добавления значения функции мы явно говорим (добавляя _ суффикс`), что мы хотим добавить саму функцию, а не возвращаемое значение этой функции.

Фрагмент кода стоит тысячи слов:

scala> def f = 3
f: Int

scala> def g = 4
g: Int

scala> val listOfInts = List(f, g)
listOfInts: List[Int] = List(3, 4)

scala> val listOfFunctions = List(f _, g _)
listOfFunctions: List[() => Int] = List(<function0>, <function0>)

Сравните тип listOfInts и listOfFunctions.Я считаю, что синтаксис f _ в мире Scala называется частично примененной функцией .

5 голосов
/ 10 января 2012

Подчеркивание означает, что valMinLen не вызывается, а используется как указатель функции.

Оператор :: объединяет списки.

Другими словами, может показаться, что код создает список validations, состоящий из функции "указатель" на valMinLen с параметрамидано, а остальная часть списка - это значение super.validations, то есть проверки суперкласса.

Я уверен, что кто-то здесь исправит мою терминологию:)

0 голосов
/ 11 января 2012

Код может быть более читабельным с некоторыми правильными отступами и введением значения val:

object permanent_link extends MappedString(this, 150) {

  override def validations = minimumValidation :: super.validations

  val minimumValidation = valMinLen(3,"Link URL must be at least 5 characters") _
}

Итак, как отмечалось ранее, оператор :: просто добавляет новый элемент в список, _ не имеет к нему никакого отношения и используется для получения объекта функции, как в

(1 :: 2 :: Nil) map (println _)

, который составляет список [1, 2] и применяет функцию println к каждому элементу (подчеркивание здесь может быть опущено). Объект println _ создает объект функции из метода println, где _ представляет отдельный параметр функции.

...