是否可以从类中分离方法?
class A {
def b(C): D
}
是否有一个函数接受b
并返回一个带有签名A => C => D
或的函数(A,C) => D
?
通常不需要从具有单个参数的方法显式创建新的二进制函数,因为当编译器需要这样的函数类型时,您可以改为使用_ methodName _
匿名函数的中缀运算符语法。
第一个_
代替目标对象(A 的实例),第二个_
代替方法的参数。
例如,如果您有一个潜在的使用网站
def swizzle(f: (A, C) => D) = sys.error("todo")
然后你可以参考这样的方法b
:
swizzle(_ b _)
好吧,我不知道执行此操作的函数,但是创建这样的函数很容易:
val f: A => C => D = a => c => a b c
您可以通过将下划线替换为创建部分应用函数的方法的参数组来将方法提升为函数。
这需要一个非抽象方法,所以稍微修改你的例子:
case class C()
case class D()
class A {
def b(c: C): D = {
val d: D = D()
println("A.b("+c+") = "+d)
d
}
}
所以功能是
val afunc: A => C => D = (a: A) => a.b _
使用一些示例参数调用函数...
afunc(new A)(C())
输出
A.b(C()) = D()
这个概念被称为eta 扩展。以下是 Scala 语言规范的相关部分:
以下四种隐式转换可以应用于未应用于某些参数列表的方法。
评价。m
类型的无参数方法=> T
总是
通过计算绑定T
的表达式转换为类型。m
隐式应用。如果该方法仅采用隐式参数,则隐式参数将按照 §7.2 的规则进行传递。
埃塔扩展。否则,如果方法不是构造函数,并且预期类型 pt 是函数类型(Ts ) ⇒ T
,则对表达式执行 eta-expansion(第 6.26.5 节)e
。
空应用程序。否则,如果e
有方法 type ()T
,它会隐式应用于空参数列表,产生e()
。