aer*_*lve 4 scala pattern-matching
试图在这里处理模式匹配 - 来自C++/Java背景,这对我来说非常陌生.
这个分支的要点是检查d元组列表的每个成员[格式为(字符串,对象).我想定义三个案例.
1)如果此函数中的计数器大于列表的大小(在另一个名为acc中定义),我想什么都不返回(因为没有匹配)2)如果key输入中的给定与列表中的元组匹配,我想返回它的值(或者,存储在元组中的任何内容.).3)如果没有匹配,则还有更多列表要迭代,递增并继续.
我的代码如下:
def get(key:String):Option[Any] = {
var counter: Int = 0
val flag: Boolean = false
x match {
case (counter > acc) => None
case ((d(counter)._1) == key) => d(counter)._2
case _ => counter += 1
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,第一种情况似乎正确编译,第二种情况引发错误:
:36: error: ')' expected but '.' found.
case ((d(counter)._1) == key) => d(counter)._2
第三个也是:
scala> case _ => counter += 1 :1: error: illegal start of definition
但我认为这是因为第二个不正确.我的第一个想法是我没有正确地比较元组,但我似乎遵循索引到元组的语法,所以我很难过.任何人都可以引导我朝着正确的方向前进吗?
希望有一些事情可以解决你的困惑:
scala中的匹配遵循以下通用模板:
x match {
case SomethingThatXIs if(SomeCondition) => SomeExpression
// rinse and repeat
// note that `if(SomeCondition)` is optional
}
Run Code Online (Sandbox Code Playgroud)
看起来你可能试图将match/case表达式用作if/else if/else类型的更多块,并且据我所知,x在所述块中并不重要.如果是这样的话,你可能会喜欢这样的事情
case _ if (d(counter)._1 == key) => d(counter)._2
Run Code Online (Sandbox Code Playgroud)
但
关于Listscala中s的一些信息.您应该始终将其视为a LinkedList,其中索引查找是一种O(n)操作.列表可以与head :: tail格式匹配,并且Nil是空列表.例如:
val myList = List(1,2,3,4)
myList match {
case first :: theRest =>
// first is 1, theRest is List(2,3,4), which you can also express as
// 2 :: 3 :: 4 :: Nil
case Nil =>
// an empty list case
}
Run Code Online (Sandbox Code Playgroud)
看起来你正在构建一种ListMap,所以我会写一个更"实用"/"递归"的方法来实现你的get方法.
我假设这d是类型的支持列表List[(String, Any)]
def get(key: String): Option[Any] = {
def recurse(key: String, list: List[(String, Any)]): Option[Any] = list match {
case (k, value) :: _ if (key == k) => Some(value)
case _ :: theRest => recurse(key, theRest)
case Nil => None
}
recurse(key, d)
}
Run Code Online (Sandbox Code Playgroud)
三个案例陈述可以解释如下:
1)第一个元素list是元组(k, value).列表的其余部分与之匹配,_因为在这种情况下我们不关心它.条件询问是否k等于我们正在寻找的密钥.在这种情况下,我们想要value从元组返回.
2)由于第一个元素没有正确的密钥,我们想要递归.我们不关心第一个元素,但是我们想要列表的其余部分,以便我们可以用它来递归.
3)case Nil表示列表中没有任何内容,应该标记"失败"和递归的结束.在这种情况下,我们返回None.counter > acc从您的问题中考虑这与您的条件相同.
请不要犹豫,要求进一步解释; 如果我不小心弄错了(不会编译等),请指出它,我会解决它.