稍后编辑:
Why are Scala class methods not first-class citizens?
Motivation for Scala underscore in terms of formal language theory and good style?
使用_
通配符或占位符语法:Scala placeholder syntax
在处理数据结构和集合时,占位符语法特别有用。许多核心排序,过滤和其他数据结构方法都倾向于使用 第一类函数和占位符语法减少了所需的额外代码量 称这些方法。
问题身体
我尝试了Scala对一阶函数的支持,并遇到了this问题,关于将方法作为参数传递。据我所知,解决方案是使用(命名或匿名)一阶函数包装方法。这对我有用:
def wrapperFn(s:String):String = s.reverse
wrapperFn
现在可以作为参数传递给其他高阶函数,或者作为其他定义的值传递给这样的:
val otherGoodFn:(String=>String) = goodWrapperFn
到目前为止一切顺利。问题来自于我尝试混合两个步骤(避免使用s
参数有点冗长),并直接将方法传递给函数类型的值,如下所示:
def errorFn:(String=>String) = String.reverse
会引发以下错误:
error: value reverse is not a member of object String
def errorFn:(String=>String) = String.reverse
^
我不明白,因为这可以按预期工作:
val s:String = "hello"
s.reverse
显然,该方法是实例的成员,但不是Object / Class的成员(??)似乎Scala以与Java不同的方式处理类和对象的生命周期。所以我的问题,现在更简洁:
提前致谢!
答案 0 :(得分:2)
String.reverse
将调用静态方法(或object
上的方法而不是Scala术语中的类)。
你可以做到
def errorWrapperFn:(String=>String) = _.reverse
此处的下划线允许您访问方法/函数参数,而无需为其命名。