Скала "матч" помощь - PullRequest
       4

Скала "матч" помощь

11 голосов
/ 22 декабря 2010

Я изучаю некоторый скала-код и нашел этот метод, который сбивает меня с толку.Что такое конструкция sublist@ в утверждении match?какое значение оно содержит?когда я печатал его, его разница не равна tail, но если я заменю его на tail, функция возвращает результат diff.Может кто-нибудь объяснить, что это такое, и указать мне правильный ресурс, чтобы понять это?(Я знаю, что могу искать в Google, но не знаю, что искать ..)

def flatMapSublists[A, B](ls: List[A])(f: (List[A]) => List[B]): List[B] =
    ls match {
      case Nil => Nil
      case sublist@(_ :: tail) => f(sublist) ::: flatMapSublists(tail)(f)
    }

Ответы [ 2 ]

28 голосов
/ 22 декабря 2010

Я бы назвал это "съешь свой пирог и сделай это слишком оператором". На любом уровне сопоставления с образцом вы можете присвоить детали имя (до @) и дополнительно деконструировать его (после @). Например, представьте, что вы хотите сопоставить список с 3 элементами, вам нужен второй элемент, но вы хотите зарегистрировать весь список:

something match {
  case list@List(_,elem,_) => log("matching:" + list); elem    
  case _ => error("not found")
}   

Без этой функции вы должны были написать что-то вроде

something match {
  case List(a,elem,b) => log("matching:" + List(a,elem,b)); elem    
  case _ => error("not found")
}   

Как видите, нам нужно назвать первый и третий элемент только потому, что нам нужно, чтобы они получили список с той же структурой справа, который является стандартным. Намного проще и понятнее, если вы можете дать всему объекту имя (list), а также детали, расположенные глубже в структуре (elem), когда вам нужно оба с правой стороны.

8 голосов
/ 22 декабря 2010

В этом случае подсписок становится именованной переменной для всего списка (_ :: tail).хвост - это, ну, хвост списка.Я не уверен, что здесь есть правильное имя для «@».

Я не вижу здесь цели для подсписка, так как вы можете просто напрямую ссылаться на ls.

Отказ от ответственности: я новичок в Scala.Надеюсь, я понял это правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...