【发布时间】:2010-12-21 13:12:11
【问题描述】:
当试图弄清楚库是如何工作的时,隐式转换令人困惑。例如,查看像 'val foo: Foo = 1' 这样的表达式,是什么将 1 转换为 Foo?
是否可以指示 scala 库(或 REPL)在计算表达式时打印出正在执行的代码路径?
【问题讨论】:
标签: scala read-eval-print-loop
当试图弄清楚库是如何工作的时,隐式转换令人困惑。例如,查看像 'val foo: Foo = 1' 这样的表达式,是什么将 1 转换为 Foo?
是否可以指示 scala 库(或 REPL)在计算表达式时打印出正在执行的代码路径?
【问题讨论】:
标签: scala read-eval-print-loop
您可以将“-Xprint:typer”添加到编译器命令行(或“-Ybrowse:typer”用于swing GUI 浏览器)以查看显式应用转换的代码。
【讨论】:
作为打印转换的替代方法,必须意识到隐式不能突然出现。您必须以某种方式将它们纳入范围。替代方案是:
import 语句。当y 是一个对象时,请注意import x.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));
()
}
}
}
【讨论】: