在 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
以查看它的定义位置:RegexParsers
。 JavaTokenParsers
的文档显示了该方法的定义,即使它没有在该类中定义或覆盖。
这是特别重要的,因为如果您检查 SBT API Documentation在 DefaultProject
上,您会偶然发现它本身没有定义任何方法,并且仅在其 40 个(如果我算对的话)祖先上提供方法的 name特征和类别。单击 ManagedProject
可能需要一段时间才能发现它具有从 String
到 GroupID
和 RepositoryName
的隐式转换>,前者定义%
和%%
,而后者定义at
。
关于scala - 阅读 Scala DSL 代码的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4747864/