我知道在SCALA中我可以通过定义一些隐式函数将类型转换为另一种类型,我的问题是,我如何知道在导入大量软件包后我可以使用哪些转换?
例如,我有一个字符串,而且我怎么知道它可以转换为什么类型?
编辑澄清一下,我想在我的scala编译插件中执行它,所以我可能需要在一个reflect.api.tree类型上调用一个函数,然后得到implicits。我正在寻找一些方法来使用答案中提到的隐式[]。
答案 0 :(得分:5)
在REPL中,您可以调用:implicits
来查看除Predef中可用的范围之外的所有范围内隐含。 (添加-v
以查看Predef含义。)
您还可以从代码中的任何位置调用implicitly[]
函数来测试特定的含义。
scala> implicitly[String => Seq[Char]]
res0: String => Seq[Char] = <function1>
scala> implicitly[String => Array[Char]]
<console>:12: error: No implicit view available from String => Array[Char].
implicitly[String => Array[Char]]
^
答案 1 :(得分:2)
在 scala repl 中,您可以使用:implicits -v
在此上下文中列出所有implicits
,例如:
/* 69 implicit members imported from scala.Predef */
/* 7 inherited from scala */
final implicit class ArrayCharSequence extends CharSequence
final implicit class ArrowAssoc[A] extends AnyVal
final implicit class Ensuring[A] extends AnyVal
final implicit class RichException extends AnyVal
final implicit class SeqCharSequence extends CharSequence
final implicit class StringFormat[A] extends AnyVal
final implicit class any2stringadd[A] extends AnyVal
...
答案 2 :(得分:0)
虽然我接受了jwvh的答案,但他的回答只适用于普通用户。我喜欢在编译器插件中执行它的一个棘手的方法,代码不是常用的,所以我不在这里粘贴它,如果你们有兴趣了解如何在编译器插件中获取所有隐式值,你可以参考我的github Scala-completion-Base