3

在 Squeryl入门页面上有一个 Scala 代码示例:

import sbt._

class Project(info: ProjectInfo) extends DefaultProject(info) {

   val squeryl = "org.squeryl" % "squeryl_2.8.1" % "0.9.4-RC3"
}

我很困惑,因为 % 不是 RichString 或 String 类中定义的方法。我最好的猜测是它在别处定义并称为隐式转换。

在 Scala 中阅读和理解此类代码的最佳方法是什么?

4

3 回答 3

5

它只能来自import sbt._或来自DefaultProject。由于sbt不是包对象,它必须来自DefaultProject.

这是因为隐式必须定义或导入到作用域中,并且您只能从对象(object对象或类的实例)中导入它们。例外是在源或目标(当已知时)类型的伴随对象上隐含定义的,这两者都不适用,因为您已经检查过。

不过,这有点没有实际意义。创建新的Scaladoc的原因正是为了处理这些问题。

以 Scala 解析器为例:

import scala.util.parsing.combinator.JavaTokenParsers
object T extends JavaTokenParsers {
    def myparser = "\\w+".r ~ "\\d+".r
}

该方法~未定义在 上Regex,因此我们搜索它。在此处查看最新的 scaladoc以尝试以下说明。

最简单的方法:点击#左上角的 ,获取以符号开头的方法列表。向下滚动到~,然后查看:BigInt OnceParser Parser Parsers。从这里开始,使用试验、错误和直觉。

有条不紊的方法:JavaTokenParsers在搜索框上输入快速找到班级,然后选择它。在方法列表中,找到implicitRegex到其他东西的方法。只有一个,需要Parser. 点击Parser验证。

您可能想要单击 进行implicit def regex转换的方法,以查看它的定义位置:RegexParsers。显示该方法定义的文档,JavaTokenParsers即使它没有在该类中定义或覆盖。

这一点特别重要,因为如果您在 上查看SBT API 文档DefaultProject,您会发现它本身没有定义任何方法,并且仅在其 40 个(如果我算对的话)祖先特征类。可能需要一段时间,直到您单击ManagedProject才能发现它具有从String两者的隐式转换GroupIDRepositoryName,前者定义%%%,而后者定义at

于 2011-01-20T20:49:03.503 回答
3

IntelliJ 的 Scala 插件通常可以为您找到它们,因此您可以使用 ^b 直接找到它们。除此之外,它是对文档的搜索,从您导入的内容开始。

于 2011-01-20T13:48:34.463 回答
1

这是一个隐式转换好吧!

与所有隐式一样,如果它没有在核心库中预定义,那么开始查找的最佳位置是您的导入和超类。

在给定的示例中,这很明显来自 SBT,因此您可以通过在 google 代码上快速搜索找到它

于 2011-01-20T14:29:00.187 回答