scala分号推断示例

时间:2017-05-04 09:28:23

标签: scala

“Scala编程”介绍了分号推理的规则:

简而言之,除非满足下列条件之一,否则将行结尾视为分号:

  1. 有问题的行以单词形式结束,作为语句的结尾不合法,例如句号或中缀运算符。
  2. 下一行以一个无法启动语句的单词开头。
  3. 该行在括号(...)或括号[...]内结束,因为它们无论如何都不能包含多个语句。
  4. 但我找不到一个例子,在第二个条件下,谁可以举个例子? 我尝试了以下代码,因为*无法启动语句,但它失败了!

        1 * 2
        *3
    

1 个答案:

答案 0 :(得分:3)

  

" scala编程"介绍了分号推理的规则:

     

简而言之,除非满足下列条件之一,否则将行结尾视为分号:

     
      
  1. 有问题的行以单词形式结束,作为语句的结尾不合法,例如句号或中缀运算符。
  2.   
  3. 下一行以一个无法启动语句的单词开头。
  4.   
  5. 该行在括号(...)或括号[...]内结束,因为它们无论如何都不能包含多个语句。
  6.   

请注意,这是一个相当简化的视图。完整规则位于section 1.2 Newline CharactersScala Language Specification

  

但是我找不到一个例子,在第二个条件下,谁可以给出一个例子?

根据SLS:

  

可以开始声明的令牌是所有Scala令牌 ,除了以下分隔符和保留字:

     
      
  • catch
  •   
  • else
  •   
  • extends
  •   
  • finally
  •   
  • forSome
  •   
  • match
  •   
  • with
  •   
  • yield
  •   
  • ,
  •   
  • .
  •   
  • ;
  •   
  • :
  •   
  • =
  •   
  • =>
  •   
  • <-
  •   
  • <:
  •   
  • <%
  •   
  • >:
  •   
  • #
  •   
  • [
  •   
  • )
  •   
  • ]
  •   
  • }
  •   

所以,一个例子可能是:

return 42
.toString()

这相当于

return 42.toString(); // returns the `String` "42"

return 42;  // returns the `Int` 42
.toString() // dead code
  

我尝试过以下代码,因为*无法启动语句,但失败了!

1 * 2
*3

是什么让你认为*无法发表声明?请仔细阅读规范。方法调用完全合法地开始声明:

foo(bar)

有效,

也是如此
*(3)

Ergo,* 可以开始声明。完整的例子:

object Test
  def test = {
    1 * 2
    *(3)
  }

  def *(x: Int) = {
    println(x)
    x + 1
   }
 }

Test.test
// 3
//=> res0: Int = 4