让我们假设这个功能:

def autoClosing(f: {def close();})(t: =>Unit) = {
    t
    f.close()
}

和这片段:

val a = autoClosing(new X)(_)
a {
 println("before close")
}

它是可能的咖喱第一部分?是这样的:

val a = autoClosing(_) { println("before close") }

因此,我可以发送对象在这附近应该执行,并具有相同的框执行上他们吗?

有帮助吗?

解决方案

是的,只要您给出占位符字符的类型,您给出的代码片段就可以工作。

因此,您正在寻找的代码是:

val a = autoClosing(_: {def close();}) { println("before close") }

其编译并按预期工作:)。

一些注意事项:

  • 如果你为一个类型定义一个类型别名,你的生活会更轻松。 AnyRef 类型有一个 close 方法,比如 type Closeable = AnyRef {def close()}, ,或适当的接口。
  • 代码片段 autoClosing(_: Closeable){ ... } 实际上等价于下面扩展的匿名函数: c: Closeable => autoClosing(c){ ... }. 。通配符只是部分应用函数的简写。您需要给出的类型 _ 不幸的是,类型推断器在这种情况下无法推断出类型。

希望能帮助到你,

——弗拉维·西普西甘

其他提示

可替换地可以翻转的参数:

def flip[A1, A2, B](f: A1 => A2 => B): A2 => A1 => B = x1 => x2 => f(x2)(x1)

在你的情况:

val a = flip(autoClosing){ println("before close") }

编辑: 我已经添加了一些括号来帮助人类解析器:

def flip[A1, A2, B](f: (A1 => (A2 => B))): (A2 => (A1 => B)) = {
    x1 => (x2 => f(x2)(x1))
}

翻转转换函数(A1 => (A2 => B))(A2 => (A1 => B))

scala> def x(x1 : Int)(x2 : Long) = 1.0 * x1 / x2
x: (Int)(Long)Double

scala> val f = flip(x)
f: (Long) => (Int) => Double = <function>

scala> val g = f(1)
g: (Int) => Double = <function>

scala> val h = g(2)
h: Double = 2.0

scala> x(1)(2)
res0: Double = 0.5

我很高兴看到这么多的人回答斯卡拉问题。它不会使它更难对我来的东西,但是。这是一种替代 Flaviu's 解决方案.

val a: {def close();} => Unit = autoClosing(_) { println("before close") }

当然,适当的解决方案是定义autoClosing的方式兼容你如何去使用它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top