Является ли совпадение языковой особенностью? - PullRequest
4 голосов
/ 01 февраля 2011

Я учу себя Скале, и у меня есть своего рода философский вопрос.Соответствует ли шаблон шаблону language в Scala или это просто библиотека?Другими словами, могу ли я, если я достаточно опытен, написать xmatch, функцию, которая идентична match во всех отношениях, кроме имени?На самом деле, я думаю, что это два слегка разных вопроса: соответствует ли функция библиотеки, и может это будет функция библиотеки?упражнение, но я хотел быть уверенным, что это возможно.

Ответы [ 3 ]

5 голосов
/ 01 февраля 2011

Сопоставление с образцом - это языковая функция, из которой оператор match является лишь наиболее ярким примером.Вот два других часто используемых примера:

val List(x,y,(z: Int,w: Int)) = List("one","two",(3,4))
for ((text,i) <- List(("one",1),("two",2))) println(text + " = " + i)

Итак, нет, вы не можете сделать это самостоятельно.Язык не позволяет вам определять новые способы создания переменных, поэтому такие вещи могут происходить только с поддержкой языка.

Сам оператор match использует поддержку создания переменных сопоставления с образцом внутри языка, нов противном случае в принципе может быть реализовано как функция библиотеки.Однако в некоторых случаях это было бы неэффективно:

// This is implemented with fast jumps, not slow if-then-else!
n match {
  case 0 => // Do action 0
  case 1 => // Do action 1
  case 2 => // Do action 2
  case _ => // Do default action
}

// This is tail recursive, so you won't overflow the stack!
def recursiveMatch(xs: List[Any]): List[Any] = xs match {
  case (x @ Int) :: rest => recursiveMatch(rest)
  case _ => xs
}

В общем, нет, вы не можете написать сопоставление с шаблоном самостоятельно, и хотя вы можете написать оператор сопоставления, есть преимущества в использованиисуществующий.

4 голосов
/ 01 февраля 2011

На самом деле, match раньше был реализован в библиотеке, я слышал. Журнал изменений в справочнике Scala указывает, что match стал зарезервированным ключевым словом в версии 2.0, после чего object.match { ... } также перестал быть допустимым синтаксисом.

Принципиально реализовать это довольно просто:

implicit def toMyMatch[T](obj: T) = new {
    def myMatch[R](f: T => R) = f(obj)
}

Я не знаю точных причин, почему это перестало реализовываться таким образом.

2 голосов
/ 01 февраля 2011

Сопоставление с образцом - это определенно языковая особенность.Тем не менее, поскольку писать структуры потока управления в Scala очень легко (а сопоставление с образцом надежно), вы можете легко написать свой собственный match (по сравнению с другими языками).

match, с другойРука, по-прежнему является частью языкового ядра (я думаю), но ведет себя гораздо больше, как что-то в библиотеке.Это кажется таким органичным из-за того, насколько мощным является сопоставление с образцом.

Тем не менее, вы можете определенно переписать match.

...