scala - 阅读 Scala DSL 代码的最佳方法是什么?

标签 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 中阅读和理解此类代码的最佳方法是什么?

最佳答案

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

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

不过,这有点没有实际意义。之所以创建新的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快速找到类,然后选择它。在方法列表中,找到从 Regex 到其他东西的 implicit。只有一个需要Parser。点击Parser进行验证。

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

这是特别重要的,因为如果您检查 SBT API DocumentationDefaultProject 上,您会偶然发现它本身没有定义任何方法,并且仅在其 40 个(如果我算对的话)祖先上提供方法的 name特征和类别。单击 ManagedProject 可能需要一段时间才能发现它具有从 StringGroupIDRepositoryName 的隐式转换>,前者定义%%%,而后者定义at

关于scala - 阅读 Scala DSL 代码的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4747864/

相关文章:

Scala 2.8 Actor

scala - Scala 集合转发器和代理的用例

scala - 将非参数化 Java 1.4 Collection 转换为参数化 Scala 序列

scala - 可以重命名基类中的 Scala 方法吗?

scala - 为什么 Spark RDD 在 T 中是不变的?

scala - 为什么 Spark Streaming 应用程序使用 sbt run 可以正常工作,但不能在 Tomcat(作为 Web 应用程序)上运行?

scala - 如何在 Scala 中定义新的原始数据类型及其行为

scala - Spark负载模型并继续训练

scala - Squeryl session 管理与 'using'

scala - 是否有任何 Scala ORM 实现了从 SQL -> Scala 生成代码?