zoukankan      html  css  js  c++  java
  • 浅谈 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(123) foreach { _ => println("Hi") }
     
    5、通配模式:Wildcard patterns
    Some(5match case Some(_=> println("Yes") }
    val (a, _= (12)
    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(123) map (_ 2)
    _ _   
     
    10、偏应用函数:Partially applied functions
    List(123) foreach println _
     
    11、初始化默认值:default value
    var i: Int = _
     
    12、访问元组:tuple getters
    t._2 
     
    13、参数序列:parameters Sequence 
    _*作为一个整体,告诉编译器你希望将某个参数当作参数序列处理!例如val = 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: => 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/

  • 相关阅读:
    转载: RAID详解[RAID0/RAID1/RAID10/RAID5]
    用户交互式命令:read
    linux下fdisk分区管理、文件系统管理、挂载文件系统等
    linux文件系统下的特殊权限
    find命令详解
    python3中 getpass模块使用
    个人shell积累
    手把手教你利用爬虫爬网页(Python代码)
    数通HCIP-ospf知识点
    HCIE之路--超全ospf思维导图
  • 原文地址:https://www.cnblogs.com/tonychai/p/4546264.html
Copyright © 2011-2022 走看看