【问题标题】:Scala error: value <FUNCTION_NAME> is not a member of object <OBJECT_NAME>Scala 错误:值 <FUNCTION_NAME> 不是对象 <OBJECT_NAME> 的成员
【发布时间】:2017-02-10 21:07:46
【问题描述】:

稍后编辑:

  • 相关问题:

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

显然,该方法是实例的成员,但不是对象/类的成员(??)似乎 Scala 以与 Java 非常不同的方式处理类和对象的生命周期。所以我的问题,现在更简洁:

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

提前致谢!

【问题讨论】:

    标签: scala function methods


    【解决方案1】:

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

    你可以的

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2015-10-03
    • 2015-08-06
    • 2016-05-01
    相关资源
    最近更新 更多