第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

大括號(hào)和括號(hào)在Scala中有什么形式上的區(qū)別,應(yīng)該在什么時(shí)候使用它們?

大括號(hào)和括號(hào)在Scala中有什么形式上的區(qū)別,應(yīng)該在什么時(shí)候使用它們?

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

3 回答

?
楊魅力

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊

我試過一次寫這篇文章,但最后我放棄了,因?yàn)橐?guī)則有些分散?;旧?,你必須掌握它的訣竅。

也許最好集中注意在什么地方可以互換地使用大括號(hào)和括號(hào):當(dāng)將參數(shù)傳遞給方法調(diào)用時(shí)。你,你們可以,可能將括號(hào)替換為大括號(hào)當(dāng)且僅當(dāng)該方法需要一個(gè)參數(shù)。例如:

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

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

使用Parens增加編譯檢查

噴霧的作者推薦圓型父母,因?yàn)樗麄兲峁└嗟木幾g檢查。這對(duì)于像噴霧這樣的DSL來說尤其重要。通過使用Parens,您正在告訴編譯器應(yīng)該只給它一行;因此,如果您不小心給了它兩個(gè)或兩個(gè)以上,它就會(huì)抱怨?,F(xiàn)在,大括號(hào)的情況并非如此-例如,如果您在某個(gè)地方忘記了一個(gè)操作符,那么您的代碼就會(huì)編譯,您就會(huì)得到意想不到的結(jié)果,并且可能會(huì)有一個(gè)很難找到的bug。下面是人為的(因?yàn)楸磉_(dá)式是純的,至少會(huì)給出一個(gè)警告),但是要指出這一點(diǎn):

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

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

對(duì)于帶有默認(rèn)參數(shù)的多參數(shù)方法,人們可能會(huì)認(rèn)為它類似;在使用Parens時(shí),不可能意外地忘記一個(gè)逗號(hào)來分隔參數(shù)。

滔滔不絕

一個(gè)經(jīng)常被忽視的關(guān)于冗長的重要注釋。使用花括號(hào)不可避免地會(huì)導(dǎo)致冗長的代碼,因?yàn)?/trans>Scala風(fēng)格指南明確指出,關(guān)閉花括號(hào)必須在自己的線上:

…關(guān)閉大括號(hào)緊跟在函數(shù)的最后一行之后。

許多自動(dòng)改革者,如IntelliJ,將自動(dòng)為您執(zhí)行此重新格式化。所以當(dāng)你可以的時(shí)候,試著堅(jiān)持使用圓形的父母。

內(nèi)定表示法

當(dāng)使用infix表示法時(shí),如List(1,2,3) indexOf (2)如果只有一個(gè)參數(shù),則可以省略括號(hào),并將其寫入List(1, 2, 3) indexOf 2..這不是點(diǎn)表示法的情況。

還請(qǐng)注意,當(dāng)您有一個(gè)參數(shù)是一個(gè)多令牌表達(dá)式時(shí),如x + 2a => a % 2 == 0,您必須使用括號(hào)來表示表達(dá)式的邊界。

元組

因?yàn)橛袝r(shí)可以省略括號(hào),所以元組有時(shí)需要額外的括號(hào),如((1, 2)),有時(shí)可以省略外括號(hào),如(1, 2)..這可能會(huì)造成混亂。

函數(shù)/部分函數(shù)文字case

Scala有一個(gè)函數(shù)和部分函數(shù)文本的語法??雌饋硎沁@樣的:

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

唯一一個(gè)你可以使用的地方case語句與matchcatch關(guān)鍵詞:

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需要花括號(hào)。如果您想知道函數(shù)和部分函數(shù)文字之間的區(qū)別是什么,答案是:Context。如果Scala需要一個(gè)函數(shù),則需要一個(gè)函數(shù)。如果它需要一個(gè)部分函數(shù),則得到一個(gè)部分函數(shù)。如果兩者都是預(yù)期的,它就會(huì)給出一個(gè)關(guān)于歧義的錯(cuò)誤。

表達(dá)式和塊

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

{
    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 )

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

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

因此,由于表達(dá)式是語句,代碼塊是表達(dá)式,下面的所有內(nèi)容都是有效的:

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 }

這不是一個(gè)方法調(diào)用,所以您不能以任何其他方式編寫它。你可以把花括號(hào)內(nèi)控件的括號(hào)。condition,以及使用括號(hào)內(nèi)代碼塊的花括號(hào):

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

所以我希望這能幫上忙。


查看完整回答
反對(duì) 回復(fù) 2019-06-28
?
紅顏莎娜

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個(gè)贊

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

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


查看完整回答
反對(duì) 回復(fù) 2019-06-28
  • 3 回答
  • 0 關(guān)注
  • 1788 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)