亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

大括號和括號在Scala中有什么形式上的區別,應該在什么時候使用它們?

大括號和括號在Scala中有什么形式上的區別,應該在什么時候使用它們?

大括號和括號在Scala中有什么形式上的區別,應該在什么時候使用它們?將參數傳遞給括號中的函數之間的形式區別是什么?()戴著牙套{}?我從Scala的編程書中說Scala非常靈活,我應該使用我最喜歡的一個,但我發現有些情況是編譯的,而另一些則不編譯。例如(只是作為一個例子;我希望得到任何討論一般情況的答復,而不僅僅是這個特定的例子):val tupleList = List[(String, String)]()val filtered = tupleList.takeWhile( case (s1, s2) => s1 == s2 )=>Error:簡單表達式的非法開始val filtered = tupleList.takeWhile{ case (s1, s2) => s1 == s2 }=>好。
查看完整描述

3 回答

?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

我試過一次寫這篇文章,但最后我放棄了,因為規則有些分散?;旧希惚仨氄莆账脑E竅。

也許最好集中注意在什么地方可以互換地使用大括號和括號:當將參數傳遞給方法調用時。你,你們可以,可能將括號替換為大括號當且僅當該方法需要一個參數。例如:

List(1, 2, 3).reduceLeft{_ + _} // valid, single Function2[Int,Int] parameterList{1, 2, 3}.reduceLeft(_ + _) // invalid, A* vararg parameter

然而,要更好地掌握這些規則,您還需要了解更多的信息。

使用Parens增加編譯檢查

噴霧的作者推薦圓型父母,因為他們提供更多的編譯檢查。這對于像噴霧這樣的DSL來說尤其重要。通過使用Parens,您正在告訴編譯器應該只給它一行;因此,如果您不小心給了它兩個或兩個以上,它就會抱怨?,F在,大括號的情況并非如此-例如,如果您在某個地方忘記了一個操作符,那么您的代碼就會編譯,您就會得到意想不到的結果,并且可能會有一個很難找到的bug。下面是人為的(因為表達式是純的,至少會給出一個警告),但是要指出這一點:

method {
  1 +
  2
  3}method(
  1 +
  2
  3)

第一個編譯,第二個給出error: ')' expected but integer literal found..作者想寫1 + 2 + 3.

對于帶有默認參數的多參數方法,人們可能會認為它類似;在使用Parens時,不可能意外地忘記一個逗號來分隔參數。

滔滔不絕

一個經常被忽視的關于冗長的重要注釋。使用花括號不可避免地會導致冗長的代碼,因為Scala風格指南明確指出,關閉花括號必須在自己的線上:

…關閉大括號緊跟在函數的最后一行之后。

許多自動改革者,如IntelliJ,將自動為您執行此重新格式化。所以當你可以的時候,試著堅持使用圓形的父母。

內定表示法

當使用infix表示法時,如List(1,2,3) indexOf (2)如果只有一個參數,則可以省略括號,并將其寫入List(1, 2, 3) indexOf 2..這不是點表示法的情況。

還請注意,當您有一個參數是一個多令牌表達式時,如x + 2a => a % 2 == 0,您必須使用括號來表示表達式的邊界。

元組

因為有時可以省略括號,所以元組有時需要額外的括號,如((1, 2)),有時可以省略外括號,如(1, 2)..這可能會造成混亂。

函數/部分函數文字case

Scala有一個函數和部分函數文本的語法??雌饋硎沁@樣的:

{
    case pattern if guard => statements    case pattern => statements}

唯一一個你可以使用的地方case語句與matchcatch關鍵詞:

object match {
    case pattern if guard => statements    case pattern => statements}
try {
    block} catch {
    case pattern if guard => statements    case pattern => statements} finally {
    block}

你不能用case任何其他上下文中的語句..所以,如果你想用case需要花括號。如果您想知道函數和部分函數文字之間的區別是什么,答案是:Context。如果Scala需要一個函數,則需要一個函數。如果它需要一個部分函數,則得到一個部分函數。如果兩者都是預期的,它就會給出一個關于歧義的錯誤。

表達式和塊

括號可用于生成子表達式。大括號可以用來制作代碼塊(這是一個函數文字,所以要小心嘗試像一個函數一樣使用它)。代碼塊由多個語句組成,每個語句都可以是導入語句、聲明或表達式。事情是這樣的:

{
    import stuff._
    statement ; // ; optional at the end of the line
    statement ; statement // not optional here
    var x = 0 // declaration
    while (x < 10) { x += 1 } // stuff
    (x % 5) + 1 // expression}( expression )

因此,如果需要聲明、多個語句,則import或者諸如此類的東西,你需要花括號。由于表達式是語句,括號可能出現在大括號中。但有趣的是,代碼塊是表達式,因此您可以在任何地方使用它們。表達:

( { var x = 0; while (x < 10) { x += 1}; x } % 5) + 1

因此,由于表達式是語句,代碼塊是表達式,下面的所有內容都是有效的:

1       // literal(1)     // expression{1}     // block of code({1})   // expression with a block of code{(1)}   // block of code with an expression({(1)}) // you get the drift...

在那里它們是不可互換的

基本上,你不能取代{}帶著()反之亦然。例如:

while (x < 10) { x += 1 }

這不是一個方法調用,所以您不能以任何其他方式編寫它。你可以把花括號控件的括號。condition,以及使用括號代碼塊的花括號:

while ({x < 10}) { (x += 1) }

所以我希望這能幫上忙。


查看完整回答
反對 回復 2019-06-28
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

這里有幾個不同的規則和推論:首先,Scala在參數是函數時推斷大括號,例如list.map(_ * 2)牙套是推斷出來的,它只是一種更短的形式list.map({_ * 2})..其次,Scala允許您跳過最后一個參數列表上的括號,如果該參數列表有一個參數,并且它是一個函數,那么list.foldLeft(0)(_ + _)可以寫成list.foldLeft(0) { _ + _ }(或list.foldLeft(0)({_ + _})如果你想變得更明確)。

但是,如果添加case正如其他人所提到的,您將得到一個部分函數,而不是一個函數,Scala將不會推斷出部分函數的大括號,因此list.map(case x => x * 2)不起作用,但兩者都是list.map({case x => 2 * 2})list.map { case x => x * 2 }將要。


查看完整回答
反對 回復 2019-06-28
  • 3 回答
  • 0 關注
  • 1793 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號