repl杂记

  1. repl下无法定义package
    脚本其实是在一个对象的方法中运行的,定义package自然是非法的

  2. 获取jvm系统属性

     scala> sys.props.foreach(println) //或
     scala> for((k,v) <- sys.props) println(k+"="+v)
    
  3. repl启动的jvm参数通过 -J来设定

     scala -J-Xms1g -J-Xmx1G -J-XX:+UseConcMarkSweepGC 
    
  4. repl的字体颜色可以改变

     scala> Console.GREEN //字体切换为绿色,repl背景颜色也可以改
    
  5. repl设置classpath

     1) 启动后,可以通过 :cp /data/demo/whj.jar 来增加jar文件到classpath里
     2) 启动前:scala -cp /data/demo/whj.jar
    

repl下的几种模式

  1. paste mode
    最常用的一种模式,粘贴多行程序时很方便,:paste可以缩写为:pas

  2. silent mode
    安静模式,不会输出每个表达式的类型和值;在定义变量时如果不想要输出,可以用:silent启用安静模式;退出安静模式也用:silent

  3. power mode
    支持的命令和方法经常变化,比如这里这里提到的tip都已发生了变化。这个模式并不针对普通用户,并且cpu耗费很高,通常用不着。

  4. wrap mode
    觉得这个模式挺有用的,比如说对所有的方法在运行时wrap一个time函数以统计方法的执行时间。
    参考这里。但不知道为何后来给去掉了,见这里的说明。

repl下的javap

scala> :javap 在我的笔记本上(linux)不能工作:javap unavailable on this platform
搜索后:http://www.scala-lang.org/node/10703

在启动时将 tools.jar设置到classpath即可:

$ scala -cp /data/program/java/lib/tools.jar

不过另外的问题是在REPL下使用 javap不如在命令行下更清晰,比如 object A{def foo(){}} 在命令行下实际编译成了2个class 一个 A.class 另一个 A$.class

A.class反编译的内容为:

public final class A extends java.lang.Object{
    public static final void foo();
}

A$.class反编译的内容为:

public final class A$ extends java.lang.Object implements scala.ScalaObject{
    public static final A$ MODULE$;
    public static {};
    public A$();
}

在 REPL下用:javap看到的是合在一起的:

scala> :javap A
Compiled from "<console>"
public final class A$ extends java.lang.Object implements scala.ScalaObject{
    public static final A$ MODULE$;
    public static {};
    public void foo();
    public A$();
}

另,对于jdk1.7,目前在repl下javap还不work