当我使用:加载在spark-shell中时,看起来好像是单独读取的行,因此同伴对象不会在同一个" source"文件。 :paste似乎没有参数。
之前我正在使用我的代码构建并加载一个jar到spark-shell中但是为了简单起见我希望将它作为脚本运行。有没有人有最喜欢的解决方法?
答案 0 :(得分:2)
最新的shell将包含:粘贴文件。
或者,作为一种解决方法,将模板链接到:加载它们:
class C(i: Int) {
def c = { println("C..."); i }
}; object C {
def apply(i: Int = 42) = new C(i)
}
或者,
scala> (new $intp.global.Run) compile List("C.scala")
scala> new C().c
C...
res1: Int = 42
更多API:
scala> import reflect.io._
import reflect.io._
scala> import reflect.internal.util._
import reflect.internal.util._
scala> val code = File("C.scala").slurp
code: String =
"
class C(i: Int) { def c = { println("C..."); i } }
object C { def apply(i: Int = 42) = new C(i) }
"
scala> $intp interpret code
defined class C
defined object C
res0: scala.tools.nsc.interpreter.IR.Result = Success
scala> C()
res1: C = C@f2f2cc1
类似地,
scala> $intp interpret s"object X { $code }"
defined object X
res0: scala.tools.nsc.interpreter.IR.Result = Success
scala> X.C()
res1: X.C = X$C@7d322cad
我的启动脚本定义:
implicit class `interpreter interpolator`(val sc: StringContext) { def i(args: Any*) = $intp interpret sc.s(args: _*) }
的
scala> i"val x = 42"
x: Int = 42
res0: scala.tools.nsc.interpreter.IR.Result = Success
答案 1 :(得分:0)
这个compile
技巧似乎不适用于"脚本"文件。它期望源文件可由scalac
编译,其中所有val
和def
声明都在一个类型中。
因此,与:load
一起使用的另一种方法是将case类和伴随对象写入另一个对象中。在这里,我只是粘贴代码而不使用:paste
,但它也适用于:load
。
scala> object O {
| case class C(s: String)
| object C {
| def apply() = new C("<no string>")
| }
| }
defined module O
scala> O.C()
res0: O.C = C(<no string>)