Вот мои 2 цента. Возьмем простое совпадение Option
с шаблоном:
val o = Some(1)
o match {
case Some(i) => i + 1
case None => 0
}
В Scala происходит так много всего. Компилятор проверяет, есть ли у вас полное соответствие, создает новую переменную i
для области действия оператора case
и, конечно же, каким-то образом извлекает значение из Option
.
Извлечь значение можно на таких языках, как Java. Реализуйте unapply
методы некоторого согласованного интерфейса, и все готово. Теперь вы можете возвращать значения вызывающему.
Предоставление этого извлеченного значения вызывающей стороне, что по существу требует закрытия, не так удобно в обычных объектно-ориентированных языках без поддержки закрытия. Это может стать довольно уродливым в Java7, где вы, вероятно, использовали бы шаблон Observer.
Если вы добавите в смесь другие возможности Scala по сопоставлению с образцом, например сопоставление по определенным типам, то есть case i: Int =>
; используя предложение по умолчанию _
, когда вы хотите (компилятор должен каким-то образом проверять полноту, используете ли вы _
или нет); дополнительные проверки типа case i if i > 0 =>
; и так далее он быстро становится очень уродливым для использования со стороны клиента (подумайте о Java).
Если вы отбросите все эти причудливые функции сопоставления с образцом, сопоставление с образцом будет в значительной степени на уровне оператора Java switch
.
Похоже, что просто не стоит, даже если это возможно, реализовывать с использованием анонимных классов без поддержки лямбда-выражений и строгой системы типов.
person
yǝsʞǝla
schedule
01.08.2014