0

在以下代码中:

val expression : String = "1+1";
     for (expressionChar <- expression) {
      println(expressionChar)
    }

输出为“1+1”

在这里如何访问每个字符?Scala 的幕后发生了什么。使用 Java 我需要使用 .charAt 方法,但在 Scala 中不需要,为什么?

4

2 回答 2

4

在 scala 中,用于理解:

for (p <- e) dosomething

将被翻译成

e.foreach { x => dosomething } 

您可以查看Scala Reference 6.19 了解更多详细信息。但是,String在 scala 中只是一个 Java String,它没有方法foreach但是Predef中定义了一个隐式转换,它转换StringStringOps,它确实有一个foreach方法。

所以,最后代码for(x <- "abcdef") println(x)被翻译成:

Predef.augmentString("abcdef").foreach(x => println(x))

您可以查看 scala 参考或Scala Views以获取更多信息。

于 2013-04-20T13:05:03.103 回答
2
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 节中找到。

于 2013-04-20T12:12:00.223 回答