scala:tracing暗示选择和其他代码魔法
-
10-07-2019 - |
题
在尝试计算库的工作方式时,隐式转换会让人感到困惑。例如,查看像'val foo:Foo = 1'这样的表达式,将1转换为Foo的是什么?
是否可以指示scala库(或REPL)在评估表达式时打印出正在执行的代码路径?
解决方案
您可以添加<!>“-Xprint:typer <!>”;到编译器命令行(或<!> quot; -Ybrowse:typer <!>;用于swing GUI浏览器)以查看显式应用转换的代码。
其他提示
作为打印转换的替代方法,必须意识到隐含不能只是突然出现。你必须以某种方式将它们纳入范围。替代方案是:
- 明确的
import
声明。当import x.y._
是一个对象时,请注意y
,因为这是引入隐式范围的唯一方法。 - 正在转换为其他内容的类的对象伴随。
- 目标类的对象伴侣,只要该目标以某种方式显式化(例如在您的示例中)。 醇>
请注意,默认情况下,对象scala.Predef
全部导入范围,这就是Scala默认隐含的范围。
scalac -print
在应用隐式类型转换后打印代码。
class A{
val x : String = "hi" drop 1
}
将导致:
package <empty> {
class A extends java.lang.Object with ScalaObject {
@remote def $tag(): Int = scala.ScalaObject$class.$tag(A.this);
private[this] val x: java.lang.String = _;
<stable> <accessor> def x(): java.lang.String = A.this.x;
def this(): A = {
A.super.this();
A.this.x = scala.this.Predef.forceRandomAccessCharSeq(
scala.this.Predef.stringWrapper("hi").drop(1));
()
}
}
}
不隶属于 StackOverflow