在以下代码中:
val expression : String = "1+1";
for (expressionChar <- expression) {
println(expressionChar)
}
输出为“1+1”
在这里如何访问每个字符?Scala 的幕后发生了什么。使用 Java 我需要使用 .charAt 方法,但在 Scala 中不需要,为什么?
在以下代码中:
val expression : String = "1+1";
for (expressionChar <- expression) {
println(expressionChar)
}
输出为“1+1”
在这里如何访问每个字符?Scala 的幕后发生了什么。使用 Java 我需要使用 .charAt 方法,但在 Scala 中不需要,为什么?
在 scala 中,用于理解:
for (p <- e) dosomething
将被翻译成
e.foreach { x => dosomething }
您可以查看Scala Reference 6.19 了解更多详细信息。但是,String
在 scala 中只是一个 Java String
,它没有方法foreach
。但是Predef中定义了一个隐式转换,它转换String
为StringOps,它确实有一个foreach
方法。
所以,最后代码for(x <- "abcdef") println(x)
被翻译成:
Predef.augmentString("abcdef").foreach(x => println(x))
您可以查看 scala 参考或Scala Views以获取更多信息。
scala> for (c <- "1+1") println(c)
1
+
1
是相同的
scala> "1+1" foreach (c => println(c))
1
+
1
Scalas for-comprehension 不是循环,而是对输入进行操作的高阶函数的组合。可以在此处阅读有关编译器如何翻译 for-comprehension 的规则。
此外,在 Scala 中,字符串是集合。在内部,它们只是普通的旧 Java 字符串,存在一些隐式转换,以赋予它们 Scala 集合库的全部功能。但对于用户来说,它们可以被视为集合。
在您的示例foreach
中,遍历字符串的每个元素并对它们执行闭包(这是 for-comprehension 的主体或foreach
调用中的参数)。
更多关于 for-comprehensions 的信息可以在StackOverflow Scala 教程的第 7 节中找到。