Scala错误:值<function_name>不是object <object_name>的成员

时间:2016-10-02 23:39:49

标签: scala function methods

稍后编辑:

  • 相关问题:

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

  • 在这个问题中,我试图实现更紧凑的语法,解决方案涉及所谓的占位符语法。 Jason Swartz的Learning Scala,第74页:
  • 强化了这一观点
  

在处理数据结构和集合时,占位符语法特别有用。许多核心排序,过滤和其他数据结构方法都倾向于使用   第一类函数和占位符语法减少了所需的额外代码量   称这些方法。

问题身体

我尝试了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不同的方式处理类和对象的生命周期。所以我的问题,现在更简洁:

  • 错误是由某些愚蠢的错误引起的还是确实不允许?如果不允许,为什么?

提前致谢!

1 个答案:

答案 0 :(得分:2)

String.reverse将调用静态方法(或object上的方法而不是Scala术语中的类)。

你可以做到

def errorWrapperFn:(String=>String) = _.reverse

此处的下划线允许您访问方法/函数参数,而无需为其命名。