在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中阅读和理解此类代码的最佳方法是什么?
答案 0 :(得分:5)
它只能来自import sbt._
或来自DefaultProject
。由于sbt
不是包对象,因此它必须来自DefaultProject
。
这是因为implicits 必须被定义或导入到作用域中,并且您只能从对象(object
个对象或类的实例)中导入它们。例外情况是在源或目标(当已知)类型的伴随对象上定义的隐含,它们都不适用于您已经检查过的。
以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
,查看其定义位置:RegexParsers
。 JavaTokenParsers
的文档显示了该方法的定义,即使它未在该类中定义或覆盖。
这一点特别重要,因为如果您在DefaultProject
上查看SBT API Documentation,您会偶然发现它本身没有定义方法,只提供名称 40的方法(如果我算了吧)祖先的特征和阶级。您可能需要一段时间才能点击ManagedProject
,发现它有从String
到GroupID
和RepositoryName
的隐式转化,前者定义%
和{ {1}},而后者定义%%
。
答案 1 :(得分:3)
IntelliJ的Scala插件通常可以为您找到它们,因此您可以使用^ b直接找到它。除此之外,它是对文档的搜索,从您导入的内容开始。
答案 2 :(得分:1)
这是一个隐含的转换好吧!
与所有暗示一样,如果它未在核心库中预定义,那么开始寻找的最佳位置是您的导入&超类。
在给定的示例中,这显然来自SBT,因此您可以使用quick search on google code
找到它