1. 最簡單的form
compiler會翻譯成 (e1要有implement map method才行):
這沒什麼疑問
2. 一個generator + 一個filter
compiler會翻譯成 (e1要有implement withFilter method才行):
withFilter類似filter的功用,但是是lazy evaluation,換句話說不會即刻回傳filtered collection,而是先註記這個collection即將要被filter,如果collection去做map或是flatmap等動作時,就會先做此預告的filtering。
注意if f後面有一個 ; s,所以這個filter f是有順序性的,不是永遠擺在最後,而是看你要在哪一個loop level做filtering。
3. 2 generators
compiler會翻譯成 (e1要有implement flatMap, e2 要impelemt map method才行):每個e1的element x 被map成|e2|個collection,然後flatten。
所以相當於nested loop,outerloop執行 |e1| 次,inner loop執行 |e2|次(假設s沒有其他的generator)
以上三者可以當成基礎元件來解讀一個Scala for "loop"。
4. pattern matching in for
這是我在Anagrams的作業中有用到的技巧,不過我還是第一次看到等號的expression在generators中出現?!
generator中的pattern matching其實是對 collection的filter:
不過在generators中可以寫入assignment就有點奇怪了,找更多資料再來update這篇。
沒有留言:
張貼留言