浅谈 Scala 中下划线的用途
Scala 作為一門函數式編程語言,對習慣了指令式編程語言的同學來說,會不大習慣,這里除了思維方式之外,還有語法層面的,比如?underscore(下劃線)就會出現在多種場合,令初學者相當疑惑,今天就來總結下 Scala 中下劃線的用法。
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 1、存在性類型:Existential?types def?foo(l:?List[Option[_]])?=?... 2、高階類型參數:Higher?kinded?type?parameters case?class?A[K[_],T](a:?K[T]) 3、臨時變量:Ignored?variables val?_?=?5 4、臨時參數:Ignored?parameters List(1,?2,?3)?foreach?{?_?=>?println("Hi")?} 5、通配模式:Wildcard?patterns Some(5)?match?{?case?Some(_)?=>?println("Yes")?} val?(a,?_)?=?(1,?2) for?(_?<-?1?to?10) 6、通配導入:Wildcard?imports import?java.util._ 7、隱藏導入:Hiding?imports import?java.util.{ArrayList?=>?_,?_} 8、連接字母和標點符號:Joining?letters?to?punctuation def?bang_!(x:?Int)?=?5 9、占位符語法:Placeholder?syntax List(1,?2,?3)?map?(_?+?2) _?+?_??? 10、偏應用函數:Partially?applied?functions List(1,?2,?3)?foreach?println?_ 11、初始化默認值:default?value var?i:?Int?=?_ 12、訪問元組:tuple?getters t._2? 13、參數序列:parameters?Sequence? _*作為一個整體,告訴編譯器你希望將某個參數當作參數序列處理!例如val?s?=?sum(1?to?5:_*)就是將1?to?5當作參數序列處理。 |
?
這里需要注意的是,以下兩種寫法實現的是完全不一樣的功能:
?| 1 2 3 | foo?_???????????????//?Eta?expansion?of?method?into?method?value foo(_)??????????????//?Partial?function?application |
?
Example showing why foo(_) and foo _ are different:
?| 1 2 3 4 5 6 7 8 | trait?PlaceholderExample?{ ??def?process[A](f:?A?=>?Unit) ??val?set:?Set[_?=>?Unit] ??set.foreach(process?_)?//?Error? ??set.foreach(process(_))?//?No?Error } |
?
In the first case, process _ represents a method; Scala takes the polymorphic method and attempts to make it monomorphic by filling in the type parameter, but realizes that there is no type that can be filled in for A that will give the type (_ => Unit) => ? (Existential _ is not a type).
In the second case, process(_) is a lambda; when writing a lambda with no explicit argument type, Scala infers the type from the argument that foreach expects, and _ => Unit is a type (whereas just plain _ isn't), so it can be substituted and inferred.
This may well be the trickiest gotcha in Scala I have ever encountered.
Refer:
[1]?What are all the uses of an underscore in Scala?
http://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-an-underscore-in-scala
[2]?Scala punctuation (AKA symbols and operators)
http://stackoverflow.com/questions/7888944/scala-punctuation-aka-symbols-and-operators/7890032#7890032
[3]?Scala中的下劃線到底有多少種應用場景?
http://www.zhihu.com/question/21622725
[4]?Strange type mismatch when using member access instead of extractor
http://stackoverflow.com/questions/9610736/strange-type-mismatch-when-using-member-access-instead-of-extractor/9610961
[5]?Scala簡明教程
http://colobu.com/2015/01/14/Scala-Quick-Start-for-Java-Programmers/
轉載于:https://www.cnblogs.com/tonychai/p/4546264.html
總結
以上是生活随笔為你收集整理的浅谈 Scala 中下划线的用途的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.1.1Remove Duplicat
- 下一篇: 18B树、B++树和Trie树