總之,是的<-
是斯卡拉的保留運算符。這是一個編譯器。
的foreach
有foreach
和for yield
之間有很強的區別,但語法只是語法糖,在編譯時改變。
for (i <- 1 to 10) { statement }
表達被翻譯成:
Range.from(1, 10).foreach(..)
多個變量: for (i <- 1 to 10; y <- 2 to 100) {..}
變爲:
Range.from(1, 10).foreach( el => {Range.from(2, 100).foreach(..)});
隨着由下式給出的所有變體形式:
for (x <- someList)
= someList.foreach(..)
。
簡而言之,他們都得到了脫糖至foreach
聲明。被調用的具體的foreach
由所使用的集合給出。
對於產量
的for yield
語法糖flatMap
和map
。 stay in the monad
規則適用於此處。
for (x <- someList) yield {..}
被翻譯成someList.flatMap(..)
。
連鎖經營成爲map/flatMap
連擊分層鏈:
for { x <- someList; y <- SomeOtherList } yield {}
變爲:
someList.flatMap(x => { y.flatMap(..) });
等。
點
的一點是,<-
操作無非是語法糖更使代碼更易讀,但它總是被在編譯時更換。
爲了強調羅布的點
羅布使得其他Scala的語法糖很好的例子。
上下文結合
package somepackage;
class Test[T : Manifest] {}
也被轉換爲:
class Test[T](implicit evidence: Manifest[T])
爲了證明這一點,儘量別名類型與結合上下文:
type TestAlias[T : Manifest] = somepackage.Test // error, the : syntax can't be used.
。 可能很容易看到: Manifest
零件實際上不是一個類型參數。
它只是更容易輸入class Test[T : Manifest]
而非class Test[T](implicit evidence: Manifest[T]
。
我想斯卡拉已經把我寵壞了一下。我最初認爲有很多東西是語法糖,特定於編譯器,最終建立在語言特性的基礎上。這是我最喜歡的關於Scala的東西之一;它的很多設計避免了特殊情況。不幸的是,我不知道你會怎樣設計這個。 +1和**接受**給你。 – KChaloux