直接运行scala脚本与通过scala shell运行scala脚本之间的区别

时间:2017-03-29 15:03:24

标签: scala reflection

运行简单脚本时遇到了“No TypeTag available for”错误:

import scala.reflect.runtime.{universe => ru} 
case class Person(name: String)
val classPerson = ru.typeOf[Person].typeSymbol.asClass

该脚本是Scala Reflection Doc的示例。根据{{​​3}}帖子,错误是由于案例类未在顶层定义的事实引起的。我知道scala会在运行之前自动将scala脚本编译成类,从而使case类成为内部定义的类,但如果它在scala shell中运行,则相同的脚本将起作用。那么运行scala脚本和通过scala shell运行相同的脚本有什么区别呢?

1 个答案:

答案 0 :(得分:1)

我不确定在这种情况下Scala Shell和Scala程序之间是否存在差异。如果案例类没有被定义,那么它仍然不会起作用" top-level"在shell中:

scala> import scala.reflect.runtime.{universe => ru} 
import scala.reflect.runtime.{universe=>ru}

scala> case class Something(name: String)
defined class Something

scala> ru.typeOf[Something].typeSymbol.asClass
res1: reflect.runtime.universe.ClassSymbol = class Something

scala> { case class Something(name: String); ru.typeOf[Something].typeSymbol.asClass }

<console>:16: error: No TypeTag available for Something
    { case class Something(name: String); ru.typeOf[Something].typeSymbol.asClass }
                                                  ^

[编辑]回应下面的评论:

只要案例类被定义&#34;顶级&#34;它也会在程序中工作。以下代码将编译并输出类名:

import scala.reflect.runtime.{universe => ru} 

case class Something(name: String)

object MyReflection extends App {
  println ("My case class: " + ru.typeOf[Something].typeSymbol.asClass)
}