Scala 中的占位符语法
使一切简洁的需要导致 Scala 提出了一种称为占位符语法的东西。 Scala 允许使用下划线(表示为“_”)作为一个或多个参数的占位符。我们可以将下划线考虑为需要填写值的内容。但是,每个参数在函数字面量中只能出现一次。
注意:在内部,下划线扩展为函数的字面量,该函数将输入作为 1 个参数,然后检查所提到的条件。相同的规则适用于超过 1 个参数。多个下划线表示多个参数,而不是重复使用相同的参数。因此,当您只想使用 1 个或多个参数时使用此语法。此语法不支持可重用性。
让我们借助示例了解占位符语法。
示例 1:
假设我们要检查数字是否大于 5。
scala> someNumbers.filter(_ > 5)
在上面的示例中,条件在内部扩展为:
scala> someNumbers.filter(x=>x>5)
变量 x 已替换为下划线,以使函数更简洁。
占位符语法也可用于表示多个参数。
示例 2:
假设我们要添加两个数字。如果我们理解上面的例子,我们会认为两个数字相加的正常语法应该是:
scala> val f = _ + _
当它被传递给编译器时,它会给出一个错误,因为你没有提到编译器应该作为输入的数字的“类型”。
val f = _ + _
ˆ
error: missing parameter type for expanded function ((x$1, x$2) => x$1.$plus(x$2))
我们应该提到我们期望从函数中得到的数字类型。类型可以在冒号(':') 的帮助下传递给函数。请注意,在内部,
f = _ + _
扩展为
((x$1, x$2) => x$1.$plus(x$2)).
现在,使用函数将两个数字相加的正确占位符语法是:
scala> val f = (_: Int) + (_: Int)
f: (Int, Int) => Int =
//Input
scala> f(15, 10)
//Output
res: Int = 25
因此,在传递多个参数时,请确保我们指定要传递的变量的类型。这样编译器就可以理解它需要什么样的输入。
示例 3:
scala> r.map((x,y) => x + y / x min y)
在上面的示例中,参数多次使用。在这种情况下,我们需要四个下划线。根据规则参数的数量和下划线的数量必须相同,所以我们不能使用占位符语法。