在Scala中,在某些情况下是否需要分号?

时间:2015-04-20 08:42:33

标签: scala

我正在研究Scala并尝试在我最近的项目中使用它。问题来了。这是关于分号必要性的问题之一。这是我的例子:

var str = "123.4"
var d = str toDouble
if(d > 10)
    println("Larger than 10")

无法编译这些代码。因为if(d > 10) println("Larger than 10")返回值,编译器认为此值是toDouble方法的参数。但是,toDouble没有参数。这会导致错误。

解决此问题的最简单方法是在第2行末尾添加分号。就像这样:

var str = "123.4"
var d = str toDouble;
if(d > 10)
    println("Larger than 10")

这让我很困惑,我认为我根本不需要分号,因为我不会在同一行放两个语句。有些线以分号结束而其他线不以分号结束,这让我很不舒服。还有,它有意义吗?

4 个答案:

答案 0 :(得分:9)

汇总可能的答案:要编写相同的内容而不会出现语法错误,您可以使用:

  • 分号

    var d = str toDouble;
    if (d > 10) println("Larger than 10")
    
  • 点语法

    var d = str.toDouble
    if (d > 10)  println("Larger than 10")
    
  • 括号

    var d = (str toDouble)
    if (d > 10)  println("Larger than 10")
    
  • 大括号

    var d = {str toDouble}
    if (d > 10)  println("Larger than 10")
    
  • 空行分隔符

    var d = str toDouble
    
    if (d > 10)  println("Larger than 10")
    

选择适合您风格的。 但在普通(非DSL)代码中,您通常会遇到点缀版本

分号的[大多数]常用用法是在带有多个绑定的简单for表达式中。

  for(i <- 1 to 4; j <- 1 until i) println(f"$j < $i")

顺便提一下,也可以重构为无分号版本:

  for{i <- 1 to 4
      j <- 1 until i} println(f"$j < $i")

答案 1 :(得分:5)

使用后缀运算符时,有时需要使用分号。这就是为什么后缀运算符是一种语言功能的部分原因,如果您没有明确启用它们,您将被警告。您可以改用str.toDouble语法。

答案 2 :(得分:1)

正如Imm所提到的,后缀运算符是一个附加功能。通过导入scala.language.postfixOps,您可以使编译器接受后缀语法,因此可以使用

import scala.language.postfixOps

var str = "123.4"
var d = str toDouble
if(d > 10)
    println("Larger than 10")

答案 3 :(得分:0)

是的,有时你需要加一个分号,让编译器明白下一个值不是前一个参数。就像你的情况一样:

var str = "123.4"

在上面的代码中,字符串(&#34; 123.4&#34;)不接受任何参数,因此编译器会自动理解它的行尾和它旁边的任何变量或函数是新行的开头。但万一:

var d = str toDouble

由于我们可以将参数传递给 toDouble 方法,所以编译器会理解它旁边的变量是相同的参数,为了避免这种情况我们必须使分号和编译器理解关于行尾。

相关问题