阅读Scala DSL代码的最佳方法?

时间:2011-01-20 13:45:33

标签: scala scala-2.8 squeryl

在Squeryl getting started page上有一个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中阅读和理解此类代码的最佳方法是什么?

3 个答案:

答案 0 :(得分:5)

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

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

但是,这有点没有实际意义。创建新Scaladoc的原因正是为了解决这些问题。

以Scala解析器为例:

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

方法~未在Regex上定义,因此我们会搜索它。检查最新的scaladoc here以尝试下面的解释。

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

方法:在搜索框中输入JavaTokenParsers以快速找到该类,然后选择它。在方法列表中,从implicit查找Regex到其他内容。只有一个,需要Parser。点击Parser进行验证。

您可能需要点击执行转换的方法implicit def regex,查看其定义位置:RegexParsersJavaTokenParsers的文档显示了该方法的定义,即使它未在该类中定义或覆盖。

这一点特别重要,因为如果您在DefaultProject上查看SBT API Documentation,您会偶然发现它本身没有定义方法,只提供名称 40的方法(如果我算了吧)祖先的特征和阶级。您可能需要一段时间才能点击ManagedProject,发现它有从StringGroupIDRepositoryName的隐式转化,前者定义%和{ {1}},而后者定义%%

答案 1 :(得分:3)

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

答案 2 :(得分:1)

这是一个隐含的转换好吧!

与所有暗示一样,如果它未在核心库中预定义,那么开始寻找的最佳位置是您的导入&超类。

在给定的示例中,这显然来自SBT,因此您可以使用quick search on google code

找到它