在下面的代码中,下划线字符用法的分类(或技术名称)是什么?
scala> def f: Int => Int = _ + 1
f: Int => Int
scala> f(2)
res0: Int = 3
答案 0 :(得分:11)
来自Functional Programming in Scala
...有时称为函数文字的下划线语法,我们是 甚至没有打扰命名函数的参数,使用_ 代表唯一的论点。使用这种表示法时,我们只能 在函数体中引用一次函数参数(如果 我们再次提到_,它指的是函数的另一个参数)
在你的情况下,做:
def f: Int => Int = _ + 1
与此相同:
def f: Int => Int = x => x + 1
这似乎是不必要的,但是将匿名函数传递给更高阶函数(这些函数将函数作为参数)变得非常方便:
def higherOrder(f: Int => Int) = { /* some implementation */ }
// Using your function you declared already
higherOrder(f)
// Passing an anonymous function
higherOrder((x: Int) => x + 1)
higherOrder((x) => x + 1)
higherOrder(x => x + 1)
// Passing an anonymous function with underscore syntax
higherOrder(_ + 1)
答案 1 :(得分:0)
将其视为由来电者提供的输入
scala> def incrementByOne: Int => Int = _ + 1
incrementByOne: Int => Int
你回来的是一个需要Int
并返回Int
的函数。
X => Y
返回类型表示将类型X
作为输入并返回类型Y
作为输出的函数。现在X
和Y
可以是任何类型。
要完成该示例,您可以将其称为
scala> incrementByOne(10)
res0: Int = 11
scala> incrementByOne(99)
res1: Int = 100
scala>
以Int
作为输入(10
和99
)并返回Int
作为输出(11
和100
)