代码之家  ›  专栏  ›  技术社区  ›  vaer-k Dogbert

scala方法调用后的下划线是什么意思?

  •  4
  • vaer-k Dogbert  · 技术社区  · 7 年前

    这个 scala documentation

    val numberFunc = numbers.foldLeft(List[Int]())_
    

    方法调用后的下划线是什么意思?

    2 回复  |  直到 7 年前
        1
  •  9
  •   slouc    7 年前

    foldLeft (初始值),但不提供第二个值;你把它推迟到以后。在您链接的文档中,它们在下一行中定义 squares :

    val numberFunc = numbers.foldLeft(List[Int]())_
    val squares = numberFunc((xs, x) => xs:+ x*x)
    

    (xs, x) => xs:+ x*x ,这是在定义时遗漏的第二个参数 numberFunc . 如果你马上提供的话 数字函数

    所以基本上整个事情也可以写成一行一行的咖喱形式:

    val squares = numbers.foldLeft(List[Int]())((xs, x) => xs:+ x*x)
    

    但是,如果您希望能够反复重用foldLeft,拥有相同的集合和初始值,但每次都提供不同的函数,那么定义一个单独的 numbersFunc

    val squares = numberFunc((xs, x) => xs:+ x*x)
    val cubes = numberFunc((xs, x) => xs:+ x*x*x)
    ...
    

    请注意,编译器错误消息非常简单,以防您忘记下划线:

    错误:trait中缺少方法foldLeft的参数列表 LinearSeqOptimized未应用的方法仅转换为函数 当需要函数类型时。你可以做这个转换 通过书写明确 foldLeft _ foldLeft(_)(_) 而不是

    编辑:哈哈,我刚刚意识到他们对我做了完全一样的事 cubes 在文档中。

        2
  •  2
  •   PilouPili    7 年前

    我不知道它是否有用,但我更喜欢这种语法

    val numberFunc = numbers.foldLeft(List[Int]())(_)
    

    然后 numberFunc 基本上是一个与实例方法相对应的委托(实例是 numbers )正在等待参数。在scala文档示例中,后面是lambda表达式

    推荐文章