【问题标题】:Scala implicits as explained by OderskyOdersky 解释的 Scala 隐式
【发布时间】: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


    【解决方案1】:

    首先,您应该刷新一下anonymous inner class 是什么,以及它如何在以 Java 为中心的框架中用于各种回调。

    Odersky 所说的函数类型是什么意思?

    shape(X1, ..., Xn) => Y的类型,通过traits实现 Function1[-X, +Y]Function2[-X1, -X1, +Y] 等等(如果我没记错的话,最多 22 个,除非这个限制现在已经解除)。

    将事件侦听器表示为函数类型是什么意思?

    “事件监听器”只是接受某种Event 并执行一些操作的特殊类,通常返回Unit。这与函数类型Event => Unit基本相同。

    这里发生了什么?如何使用这个 ActionListener?

    如上所述,我们正在使用方法actionPerformed 实例化一个匿名内部类,并将其作为回调安装在某个 GUI 元素上。

    如何使用下划线?

    根本不用。下划线专门用于未使用的参数。这是因为这个监听器有点笨,每次只是打印出相同的消息,不管事件是什么。

    所以这个隐式接受一个接受ActionEvent的函数并且什么都不返回。

    实现ActionListener的匿名内部类的实例需要函数f来实现方法actionPerformed,从它的签名可以看出它需要Unit作为返回类型,因为它只是执行了一些收到Event 时的副作用操作,不需要返回任何有意义的值。

    顺便说一句:由于 SAM(单一抽象方法语法糖),最后一次隐式转换现在已经基本过时了。

    【讨论】:

    • 关于最后一点,我猜 OP 意味着该函数什么都不返回(实际上是 Unit),所以在这一点上,他是相当正确的。给定此类函数的隐式方法返回一个动作侦听器。
    猜你喜欢
    • 2012-09-20
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 2019-12-24
    相关资源
    最近更新 更多