`object Foo extends (Bar => Baz)`的意思是什么?

3

我阅读了dispatch的代码,并发现了这个文件,其中写道:

object Elem extends (Res => scala.xml.Elem) {
  def apply(res: Res) =
    XML.withSAXParser(factory.newSAXParser).loadString(res.getResponseBody)
    ...
< p >“object Elem extends (Res => scala.xml.Elem)”是什么意思?


这是一个重复的内容,但它意味着Elem是一个函数,接受一个Res参数,返回一个Elem类型。X => Y表示Function1[X, Y]。 - som-snytt
通常情况下,这可能是-1,但阅读代码是+1,所以它平衡了。 - som-snytt
@som-snytt,是的,我意识到这是一个糟糕的问题。我太习惯使用匿名函数的简写形式了,以至于忘记了它的完整形式... :( - David S.
2个回答

3

A => B是用于描述匿名函数的语法。

对象声明

object Elem extends (Res => scala.xml.Elem) { /* ... */ }

是……的缩写

object Elem extends Function1[Res, scala.xml.Elem] { /* ... */ }

在自然语言中,Elem是一个函数,它可以从Res对象生成一个scala.xml.Elem对象。
查看Function1的scaladoc,它声明了一个抽象的apply方法,用于实现函数逻辑。

1

这也说明了函数是对象

函数是一组特征,特别地,接受一个参数的函数是 Function1 特征的实例。

类也可以扩展 Function ,并且这些实例可以使用 () 来调用。

scala> class AddOne extends Function1[Int, Int] {
     |   def apply(m: Int): Int = m + 1
     | }
defined class AddOne

一个好记的缩写是extends (Int => Int),它等同于extends Function1[Int, Int]
class AddOne extends (Int => Int) {
  def apply(m: Int): Int = m + 1
}

这看起来像是你问题中的语法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接