Scala中的重载方法语法

Scala中的重载方法语法,scala,Scala,我刚开始学习Scala。这段代码出现在Scala中。我有几个问题要问 trait ReadOnly { val underlying: MongoDBCollection def name = underlying getName def fullName = underlying getFullName def find(query: Query): DBCursor = { def applyOptions(cursor:DBCursor, opt

我刚开始学习Scala。这段代码出现在Scala中。我有几个问题要问

trait ReadOnly {
    val underlying: MongoDBCollection
    def name = underlying getName
    def fullName = underlying getFullName
    def find(query: Query): DBCursor = {
      def applyOptions(cursor:DBCursor, option: QueryOption): DBCursor = { 
        option match {
            case Skip(skip, next) => applyOptions(cursor.skip(skip), next)
            case Sort(sorting, next)=> applyOptions(cursor.sort(sorting), next)
            case Limit(limit, next) => applyOptions(cursor.limit(limit), next)
            case NoOption => cursor
        }
      }
      applyOptions(find(query.q), query.option)
    }
    def find(doc: DBObject): DBCursor = underlying find doc
    def findOne(doc: DBObject) = underlying findOne doc
    def findOne = underlying findOne
    def getCount(doc: DBObject) = underlying getCount doc
}
1本节讨论重载函数。在它里面我看到find被重载了。但是,我从未见过这样构造的方法:def finddoc:DBObject:DBCursor=underground find doc。我只见过这样定义的方法:def finddoc:DBObject:DBCursor={…}。如果没有括号中的内容,find如何重载?它在干什么

2本书的这一部分介绍了上述代码

这里使用模式匹配将每个查询选项应用于 在本例中,find方法返回的结果是DBCursor

我知道DBCursor是返回类型,从我最近读到的一本Android编程书中,我知道cursor是一种包含数据的对象。我想知道的是,这是指哪个find方法,DBCursor不只是返回的对象类型的名称,而不是实际对象的名称吗

这本书接着说

嵌套的applyOptions函数是递归应用的,因为每个 查询选项可以包装由下一个 变量,当它与NoOption匹配时,您将退出

我不明白它在说什么,因为几个原因,每个查询都可以包装另一个查询。我对正在使用的这个“wrap”术语感到有点困惑,但更大的问题是,如何显然有多个查询可用于包装另一个查询?对于它所指的应用程序选项,也有点模棱两可

4代码的匹配部分是如何实现的?我知道可以将参数传递给方法,但match是嵌套的,所以它如何接收参数以进行大小写匹配?

Scala方法语法

您可能已经习惯了Java,其中方法代码总是在一对大括号内。但这在Scala中是不同的,在Scala中,方法体只是一个表达式,它的计算结果是某个值,也可能有一些副作用。碰巧在Scala中,代码块也是一个有效的表达式,可以用作方法体

您可能会问:等等,如果表达式是有值的,而块是表达式,那么块的值是多少

在Scala中,块的值是该块中最后一个表达式的值。 例如,findquery:Query方法的body的值将是applyOptionsfindquery.q,Query.option-这是返回的值

数据库游标

在MongoDB中,游标是某种迭代器,您可以使用它从数据库惰性地获取数据。在您的示例中,DBCursor是find方法返回的对象类型的名称。我不明白你所说的实际物体的名字是什么意思

询问包装

仔细阅读-作者没有说查询可以包装另一个查询-他说查询选项可以包装另一个查询选项。只有一个查询,可能有多个选项,这些选项使用递归结构表示,其中每个选项包装另一个选项,例如

Limit(100, Skip(200, Sort(<sorting>, NoOption)))
applyOption函数通过查看其当前选项,对光标应用适当的操作,然后继续执行下一个包装选项,直到最后到达NoOption,从而遍历嵌套结构

模式匹配

case Skipskip,next可能看起来像一个方法调用,但事实并非如此——它只是语法相似而已。实际上,它与方法调用完全相反,因为这里我们不是在某处传递一些参数,而是从某处取出一些参数。每个案例都试图根据某种模式解构我们的质疑。例如,当我们说case Skipskip,next=>some code时,我们实际上是说:当我们的选项是Skip时,从中取出被跳过文档的数量并称之为Skip。另外,从当前选项中取出下一个包装的选项并调用它next。然后,用skip和next做一些事情

希望这能带来一些澄清