【问题标题】:How can I obtain Function objects from methods in Scala?如何从 Scala 中的方法获取 Function 对象?
【发布时间】:2010-07-13 15:00:18
【问题描述】:

假设我在 Scala 中有一个简单的类:

class Simple {
  def doit(a: String): Int = 42
}

如何将 Function2[Simple, String, Int] 存储在一个 val 中,它接受两个参数(目标 Simple 对象,String 参数),并且可以调用 doit() 让我返回结果?

【问题讨论】:

    标签: function scala pointers


    【解决方案1】:
    val f: Function2[Simple, String, Int] = _.doit(_)
    

    【讨论】:

    • 称为“部分申请”。如这里所示,这是一个特例。顾名思义,部分应用程序中可能会提供一些参数,结果函数的元数为 N-M,其中 N 是原始方法(或函数)的元数,M 是部分应用程序中固定的参数数。
    • 完美。我想知道编译器如何确定 doit 方法是否真的存在;我看到显式键入在这里起到了作用。谢谢!
    【解决方案2】:

    与 sepp2k 相同,只是使用了另一种语法

    val f = (s:Simple, str:String) => s.doit(str)
    

    【讨论】:

      【解决方案3】:

      对于那些不喜欢打字的人:

      scala> val f = (_: Simple).doit _
      f: (Simple) => (String) => Int = <function1>
      

      遵循_ 的方法适用于任何数量:

      scala> trait Complex {                        
           |    def doit(a: String, b: Int): Boolean
           | }                                      
      defined trait Complex
      
      scala> val f = (_: Complex).doit _            
      f: (Complex) => (String, Int) => Boolean = <function1>
      

      Scala Reference 的第 6.23 节“匿名函数的占位符语法”和第 7.1 节“方法值”的组合涵盖了这一点

      【讨论】:

      • 具有类型 (Simple) => (String) => Int 与类型 (Simple, String) => Int 的函数的实际含义是什么?我知道前者用 f(obj)("str") 调用,后者用 f(obj, "str") 调用,如果只用一个参数列表调用前者,则前者返回另一个函数对象:f(obj)。但就创建的对象数量和方法调用的数量而言,幕后发生了什么?
      • 创建了两个 Function1 对象而不是一个 Function2 对象,具有额外的间接级别。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 2011-02-03
      • 2018-05-25
      相关资源
      最近更新 更多