Scala 中可以不用在语句的结束位置显示地使用分号(;),编译器可以进行合理的推断。
编译器分号推断的规则
在编译时,一般情况下,一行的结束会被编译器推断成分号,除非遇到如下情况:
1.该行以一个不合法的词(word)结束,例如:句点(.)或者中缀操作符(+)
2.下一行起始词(begins word)不能开始一行语句
3.行结束语句在圆括号(parentheses)或者中括号(brackets)之内,因为这些括号不能包含多行语句(也就是说被编译器视为一行语句)
针对第三条规则:在for表达式当中,如果使用圆括号,那么有
nested loop
的情况下必须使用分号(因为编译器不会对圆括号进行分号推断),如果使用花括号(curly),编译器可以进行自动推断
def grep(pattern: String)=
for {
file <- filesHere
if file.getName.endsWith(".scala")
line <- fileLines(file)
trimmed = line.trim
if trimmed.matches(pattern)
} println(s"$file : ${trimmed}")
for (
file <- filesHere
if file.getName.endsWith(".scala"); // 此处分号不可省略
line <- fileLines(file)
if line.trim.matches(pattern)
) println(s"$file : ${line.trim}")