我正在学习 Scala,在下面的代码中使用 flatMap(取自 99 Scala 问题)我有
def myflatten(somelist : List[Any]): List[Any] = somelist flatMap {
case ms: List[_] => flatten(ms)
case e => List(e)
}
现在我完全混淆了“ms”和“e”是什么?它们一定是关键,好像我将 ms 更改为 dd,我收到错误“未找到值 ms”。如果我将鼠标悬停在它们上面,我会得到一个工具提示,上面写着“ms”是一个“List[][]”,而“e”是“Any”。
我试过在谷歌上搜索“Scala List elements ms and e”或“Scala flatMap ms and e”或“Scala case ms 和 case e 是什么意思?”但我似乎没有找到任何可以解释这些“ms”和“e”是什么的东西。
它们是关键字吗?我在哪里可以在 Scala 文档中找到有关它们的信息?
附言我理解代码,但不知道 ms 和 e 是什么
最佳答案
如果你是新手,让我一步一步解释这里发生了什么。
def myflatten(somelist : List[Any]): List[Any] = somelist flatMap {
case ms: List[_] => flatten(ms)
case e => List(e)
}
写得很详细:
def myflatten(somelist : List[Any]): List[Any] = somelist flatMap { something =>
something match {
case ms: List[_] => flatten(ms)
case e => List(e)
}
}
什么是
ms
和 e
?首先让我分解一下。
您正在对
List[Any]
进行平面映射.val x = List("Str1", "Str2", "Str3")
val y = x flatMap { elementInList => List(elementInList) }
这意味着对于列表中的每个元素,您正在创建一个包含该元素的新列表。因为它是
flatMap
你基本上得到了相同的(相同的元素)列表。查看如果您使用
map
会发生什么情况而不是 flatMap
:val x = List("Str1", "Str2", "Str3")
val y = x map { elementInList => List(elementInList) }
val
y
将是:List(List("Str1"), List("Str2"), List("Str3"))
退房 http://www.brunton-spall.co.uk/post/2011/12/02/map-map-and-flatmap-in-scala/
现在,看看冗长的例子:
def myflatten(somelist : List[Any]): List[Any] = somelist flatMap { something =>
something match {
case ms: List[_] => flatten(ms)
case e => List(e)
}
}
您正在匹配列表中的元素,或者在这种情况下称为
something
.你也在匹配元素
type
.例如
def myMatch(e: Any): String = {
e match {
case x: String => "Its a String: " + x
case y: Int => "Its a Int: " + y
//notice how im using x twice.. its because they're in separate scope!
case x: Boolean => "Its a Boolean: " + x
case _ => "Its something else!"
}
}
调用
myMatch
与参数 "hello"
它将返回 "Its a String: hello"
.调用
myMatch
与参数 1
它将返回 "Its a Int: 1"
.退房 http://docs.scala-lang.org/tutorials/tour/pattern-matching.html
什么是
e
和 ms
?让我们看看你的代码:
def myflatten(somelist : List[Any]): List[Any] = somelist flatMap {
case ms: List[_] => flatten(ms)
case e => List(e)
}
如果我们当前查看的列表中的元素是类型
List[_]
(与 List[Any]
相同),然后我们执行这个块, flatten(ms)
.ms
是 val
一旦匹配就分配给元素。如果我们当前查看的列表中的元素是类型
_
或者基本上默认( case _ =>
)然后返回一个 List(e)
包含一个元素,即我们正在查看的元素。这将始终返回
List[List[Any]]
.然后将其展平为 List[Any]
.我希望这有帮助,
里斯
关于list - Scala flatMap,什么是ms和e?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37340912/