Scala:函数文本的短格式和占位符语法

开发 后端
本文节选自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻译的《Programming in Scala》的第八章。Scala是一种针对 JVM 将函数和面向对象技术组合在一起的编程语言。

函数文本的短格式

Scala提供了许多方法去除冗余信息并把函数文本写得更简短。注意留意这些机会,因为它们能让你去掉代码里乱七八糟的东西。

51CTO编辑推荐:Scala编程语言专题

一种让函数文本更简短的方式是去除参数类型。因此,前面带过滤器的例子可以写成这样:

  1. scala> someNumbers.filter((x) => x > 0)  
  2. res7: List[Int] = List(510)  
Scala编译器知道x一定是整数,因为它看到你立刻使用了这个函数过滤整数列表(由someNumbers暗示)。这被称为目标类型化:target typing,因为表达式的目标使用——本例中someNumbers.filter()的参数——影响了表达式的类型化——本例中决定了x参数的类型。目标类型化的精确细节并不重要。你可以简单地从编写一个不带参数类型的函数文本开始,并且,如果编译器不能识别,再加上类型。几次之后你就对什么情况编译器能或不能解开谜题有感觉了。

第二种去除无用字符的方式是省略类型是被推断的参数之外的括号。前面例子里,x两边的括号不是必须的:

  1. scala> someNumbers.filter(x => x > 0)  
  2. res8: List[Int] = List(510)  
占位符语法

如果想让函数文本更简洁,可以把下划线当做一个或更多参数的占位符,只要每个参数在函数文本内仅出现一次。比如,_ > 0对于检查值是否大于零的函数来说就是非常短的标注:

  1. scala> someNumbers.filter(_ > 0)  
  2. res9: List[Int] = List(510)  
你可以把下划线看作表达式里需要被“填入”的“空白”。这个空白在每次函数被调用的时候用函数的参数填入。例如,由于someNumbers在第113页被初始化为值List(-11, -10, -5, 0, 5, 10),filter方法会把_ > 0里的空格首先用-11替换,就如-11 > 0,然后用-10替换,如-10 > 0,然后用-5,如-5 > 0,这样直到List的***一个值。因此,函数文本_ > 0与稍微冗长一点儿的x => x > 0相同,演示如下:

  1. scala> someNumbers.filter(x => x > 0)  
  2. res10: List[Int] = List(510)  
有时你把下划线当作参数的占位符时,编译器有可能没有足够的信息推断缺失的参数类型。例如,假设你只是写_ + _:

  1. scala> val f = _ + _  
  2. < console>:4: error: missing parameter type for expanded  
  3. function ((x$1, x$2) => x$1.$plus(x$2))  
  4.  val f = _ + _  
  5.  ˆ  
这种情况下,你可以使用冒号指定类型,如下:

  1. scala> val f = (_: Int) + (_: Int)  
  2. f: (Int, Int) => Int = < function>  
  3. scala> f(510)  
  4. res11: Int = 15 

请注意_ + _将扩展成带两个参数的函数文本。这也是仅当每个参数在函数文本中最多出现一次的情况下你才能使用这种短格式的原因。多个下划线指代多个参数,而不是单个参数的重复使用。***个下划线代表***个参数,第二个下划线代表第二个,第三个……,如此类推。

【相关阅读】

  1. 介绍Scala的***类函数
  2. Scala的本地函数:将私有方法转换为本地方法
  3. Scala中定义函数的方法:method
  4. 继续领悟函数式:Scala指令式风格代码的重构
  5. 学习Scala的变量范围

责任编辑:book05 来源: Artima
相关推荐

2023-10-27 13:59:30

Mybatis占位符

2009-06-16 17:54:38

Scala类语法语义

2020-10-31 17:33:18

Scala语言函数

2009-07-21 12:47:04

Scala私有字段定义操作符

2022-06-13 09:02:06

Swift类型占位符

2009-12-11 10:43:00

Scala讲座操作符函数

2022-05-25 09:15:01

Swift 5.6占位符

2009-12-11 10:42:00

Scala讲座类定义构造函数

2009-07-22 07:42:00

Scala偏应用函数

2009-12-11 10:44:00

Scala讲座函数 scala

2009-07-21 08:41:05

Scala操作符优先级

2009-06-19 10:51:39

Scalapackage访问修饰符

2009-07-08 16:10:24

Scala简介面向对象函数式

2010-04-01 08:47:09

Oracle函数

2009-09-27 15:29:00

Scala讲座面向对象Scala

2009-07-21 09:31:00

Scala基本类型文本

2024-06-20 11:52:44

C#占位符代码

2009-07-22 07:57:00

ScalaCurry化函数

2009-07-22 08:45:35

Scala超类构造器override修饰符

2009-07-21 09:31:00

Scala数学运算逻辑操作位操作符
点赞
收藏

51CTO技术栈公众号