我正在研究一些scala代码,发现这种方法令我感到困惑。在匹配语句中,sublist@
构造是什么?它包含什么样的价值?当我打印它时没有差别比tail
,但如果我用尾部替换它,该函数返回diff结果。有人可以解释它是什么,并指出一个正确的资源来理解它吗? (我知道我可以在谷歌搜索,但不知道该找什么..)
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)
}
答案 0 :(得分:28)
我称之为“吃你的蛋糕,让它也是操作员”。在模式匹配的任何级别,您可以为部件命名(在@之前)并进一步解构(在@之后)。例如,想象你想要匹配一个包含3个元素的List,你需要第二个元素,但是你想记录整个列表:
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
),那么当你需要在右侧时,这将更容易和更清晰。
答案 1 :(得分:8)
在这种情况下,子列表成为整个列表(_ :: tail)
的命名变量。尾巴是列表中的尾巴。我不确定这里是否有'@'的正确名称。
我在这里看不到子列表的用途,因为您可以直接引用ls
。
免责声明:我是斯卡拉的新手。我希望我做对了。