2017-05-04 76 views
1

「編程在階」介紹分號推理規則:階分號推理例如

總之,一個行結束被視爲分號除非滿足下列條件之一爲真:

  1. 有問題的句尾以一個單詞作爲句子的結尾而不合法,例如句點或中綴操作符。
  2. 下一行以無法啓動語句的單詞開頭。
  3. 行在括號(...)或括號[...]內結束,因爲它們無論如何都不能包含多個語句。

但我找不到一個例子,在第二種情況下,誰能舉個例子? 我試過下面的代碼,因爲*無法啓動語句,但失敗了!

1 * 2 
    *3 
+0

'一些(2).MAP {F => F * 2 }' 對不起,SO評論鬆散縮進。無論如何...如果你把'=>'放在新行上 – mfirry

+0

是什麼讓你認爲'*'不能啓動語句?請仔細閱讀http://scala-lang.org/files/archive/spec/2.13/01-lexical-syntax.html#newline-characters:它說(** bold **強調我的):「The除了以下分隔符和保留字:catch,else,extend,finally,forSome,match,和','','',',',';',':',','=','=>','<-','''','''','' )',''','}'「。請注意,'*'不會出現在該列表中,爲什麼呢?方法調用完全合法開始語句。 –

回答

3

的「在Scala編程」介紹分號推理規則:

總之,一個行結束被視爲分號除非滿足下列條件之一爲真:

  1. 有問題的行以一個詞作爲結尾,例如句點或中綴操作符結尾。
  2. 下一行以無法啓動語句的單詞開頭。
  3. 行在括號(...)或括號[...]內結束,因爲它們無論如何都不能包含多個語句。

請注意,這是一個相當簡化的視圖。完整的規則在Scala Language Specificationsection 1.2 Newline Characters

但我無法找到一個例子,在第二種情況下,誰可以舉個例子?

按照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) 

人機工程學,*可以開始的聲明。完整的例子:

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

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

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