Tej*_*eni 11 functional-programming scala pattern-matching
我在列表上进行模式匹配.无论如何我可以访问列表的第一个和最后一个元素进行比较吗?
我想做点什么......
case List(x, _*, y) if(x == y) => true
Run Code Online (Sandbox Code Playgroud)
要么
case x :: _* :: y =>
或类似的东西......在哪里x,y是列表的第一个和最后一个元素..
我怎么能这样做..任何想法?
mis*_*tor 24
使用标准:+和+:scala.collection包中的提取器
原始答案
定义自定义提取器对象.
object :+ {
def unapply[A](l: List[A]): Option[(List[A], A)] = {
if(l.isEmpty)
None
else
Some(l.init, l.last)
}
}
Run Code Online (Sandbox Code Playgroud)
可以用作:
val first :: (l :+ last) = List(3, 89, 11, 29, 90)
println(first + " " + l + " " + last) // prints 3 List(89, 11, 29) 90
Run Code Online (Sandbox Code Playgroud)
(对于您的情况:case x :: (_ :+ y) if(x == y) => true)
Deb*_*ski 16
万一你错过了明显的:
case list @ (head :: tail) if head == list.last => true
Run Code Online (Sandbox Code Playgroud)
该head::tail部分在那里,所以你不匹配空列表.
只是:
case head +: _ :+ last =>
Run Code Online (Sandbox Code Playgroud)
例如:
scala> val items = Seq("ham", "spam", "eggs")
items: Seq[String] = List(ham, spam, eggs)
scala> items match {
| case head +: _ :+ last => Some((head, last))
| case List(head) => Some((head, head))
| case _ => None
| }
res0: Option[(String, String)] = Some((ham,eggs))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7745 次 |
| 最近记录: |