【发布时间】:2018-05-21 02:06:45
【问题描述】:
我正在阅读 Odersky 关于 Scala 隐式的书,我需要一些帮助来理解他的示例。我偶然发现了这些段落:
Java 包含一个名为 Swing 的库,用于实现跨平台用户界面。 Swing 所做的其中一件事是处理来自操作系统的事件,将它们转换为独立于平台的事件对象,并将这些事件传递给称为事件侦听器的应用程序的各个部分......
如果 Swing 是在考虑 Scala 的情况下编写的,那么事件侦听器可能会由函数类型表示。
Odersky 所说的函数类型是什么意思?我通过编写 jQuery 和 Javascript 知道什么是事件监听器,但他将事件监听器表示为函数类型是什么意思?
接下来,他的代码示例对我来说有点不清楚。第一个:
val button = new JButton
button.addActionListener(
new ActionListener {
def actionPerformed(event: ActionEvent) = {
println("pressed")
}
}
)
那么这里发生了什么?我们是否将带有方法actionPerformed 的对象传递给addActionListener 方法?这里发生了什么?如何使用这个 ActionListener?
接下来,他简化的 Scala 友好代码是这样的:
button.addActionListener(
(_: ActionEvent) => println("pressed")
)
我们将一个匿名函数传递给addActionListener 方法。如何使用下划线?
最后,
implicit def function2ActionListener(f: ActionEvent => Unit) =
new ActionListener{
def actionPerformed(event: ActionEvent) = f(event)
}
所以这个隐式函数接受一个ActionEvent 并且什么都不返回的函数。 new 在这里做什么?它在做什么?它是在实例化对象中创建方法actionPerformed 吗?怎么回事?
由于这些不是完整的代码示例,我很难看到它们将如何使用以及它们如何组合在一起。对于代码中发生的事情,我也有点迷失......就像一个正在定义方法的新对象? actionPerformed 方法是否在新对象中定义?为什么?有人可以帮忙吗?
【问题讨论】:
标签: scala