的「在Scala編程」介紹分號推理規則:
總之,一個行結束被視爲分號除非滿足下列條件之一爲真:
- 有問題的行以一個詞作爲結尾,例如句點或中綴操作符結尾。
- 下一行以無法啓動語句的單詞開頭。
- 行在括號(...)或括號[...]內結束,因爲它們無論如何都不能包含多個語句。
請注意,這是一個相當簡化的視圖。完整的規則在Scala Language Specification的section 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
'一些(2).MAP {F => F * 2 }' 對不起,SO評論鬆散縮進。無論如何...如果你把'=>'放在新行上 – mfirry
是什麼讓你認爲'*'不能啓動語句?請仔細閱讀http://scala-lang.org/files/archive/spec/2.13/01-lexical-syntax.html#newline-characters:它說(** bold **強調我的):「The除了以下分隔符和保留字:catch,else,extend,finally,forSome,match,和','','',',',';',':',','=','=>','<-','''','''','' )',''','}'「。請注意,'*'不會出現在該列表中,爲什麼呢?方法調用完全合法開始語句。 –