Здравствуйте, Cyberax, Вы писали:
C>В Скале:
C>C>//Есть класс:
C>class Tree {
C> val left : Tree;
C> val right : Tree;
C>}
C>//Хочешь PM по этому классу делать? А вот обломись!
C>//Нужно делать что-то типа:
C>implicit object TreeWrapper {
C> def unapply(t : Tree) = {
C> (t.left, t.right)
C> }
C>}
C>//Теперь можно делать так:
C>val tr : Tree = ....;
C>match(tr) {
C> case TreeWrapper(t) => Console.print(t._1, t._2);
C>}
C>//Если хотим вместо неименованых параметров _1, _2
C>//использовать left и right - то нужно делать отдельный case-class
C>
Это на каком языке код? В Scala
class Test {
class Tree(val left : Tree, val right : Tree)
implicit object TreeWrapper {
def unapply(t : Tree) = Some(t.left, t.right)
}
def main(args: Array[String]) {
val tr : Tree = null;
tr match {
case TreeWrapper(t1, t2) => println(t1, t2);
}
}
}
прекрасно работает.
C>Стоит ли говорить, что после этого использование PM при работе с legacy-кодом превращается в ужас?
Ну ужас. Но не ужас-ужас-ужас. Ведь есть RichXXX, плюс, как видно экстракторы лишь на строчку длинее декомпозера.
C>>>Управляющие конструкции (в Kotline есть нелокальный return),
VD>>Чё? Это ты о инлайн-функциях что ли? Можно пример?
C>Ага. http://confluence.jetbrains.net/display/Kotlin/Nonlocal+returns+and+jumps (раздел "Break and continue is custom control structures") — в Скале такое не получается.
Отчего же? Есть scala.util.control.Break
C>Не, ну про implicit так же говорили. А получился ужастик в итоге.
Есть такое.