我读到了#34;提升"可用于将方法调用提升到函数中。这个例子是
scala> def times2(i: Int) = i * 2
times2: (i: Int)Int
我们通过应用下划线将方法提升为函数
scala> val f = times2 _
f: Int => Int = <function1>
scala> f(4)
res0: Int = 8
这有什么好处?我可以使用f(4)或times2(4)
答案 0 :(得分:5)
如果要将方法作为参数传递给更高阶函数,则必须解除。例如,如果您有f: Int => Int
和更高阶函数
def higherOrderFunction(f: Int => Int): Int = f(42)
您可以将f
传递给它。您无法使用方法执行此操作,因为方法不是值。但是,该方法可以解除到函数值:
def higherOrderFunction(f: Int => Int): Int = f(42)
def times2(i: Int) = i * 2
val f = times2 _
println(higherOrderFunction(f)) // prints 84
现在,这可能看起来不是什么大问题,因为在将times2
传递给f
时,您可以直接编写higherOrderFunction
而不是f
,因为scala会将其变成看起来很像的东西非常像(times2 _)
。
以下是语法 val times4: Int => Int = (times2 _) andThen (times2 _)
println(times4(100))
实际有用的示例:
400
这会打印f
。
关键是This is my text. <i class="far fa-question-circle" data-toggle="tooltip" data-title="This is my tooltip."></i>
是一等公民价值:您可以将其存储在某种数据结构中,或通过网络发送。这是函数式编程的全部要点:您可以将函数和闭包传递给更高阶的函数。
答案 1 :(得分:1)
Scala是一种面向对象的语言。您只能 使用对象执行操作。您只能将对象存储在变量中。您只能将对象作为参数传递。您只能返回对象。
方法不是对象。
不是对象的东西是面向对象语言中的非常大的限制。您不能将方法存储在变量中。您不能将方法作为参数传递。你不能返回一个方法。你不能在方法上调用方法。
因此,将一个方法(不是一个对象)提升到一个函数( 一个对象)的可能性是一个大问题,因为它删除了所有的限制,并允许你所有你可以用任何其他物体做的事情。