由scala replaceFirst混淆

时间:2017-03-24 05:26:28

标签: scala

scala > val a = (x:Int)=>x+1
  res0: Int => Int = <function1>
scala > val b = a.getClass
  b: Class[_ <: Int => Int] = class $anonfun$1
scala > b.getName.replaceFirst("^.*\\.", "") + ".class"
  //Why there is a prefix '$read$'
  res2: String = $read$$anonfun$1.class  

我对res2感到困惑。我认为res2应该是'$ anonfun $ 1.class'。

1 个答案:

答案 0 :(得分:5)

这个很有趣。

name

等等,什么?

scala> val a = ((x: Int) => x).getClass.getName
a: String = $anonfun$1

scala> a == "$anonfun$1"
res2: Boolean = false

因此,该类的名称实际上是scala> a.getBytes.map(_.toChar) res3: Array[Char] = Array($, l, i, n, e, 4, ., $, r, e, a, d, $, $, i, w, $, $, i, w, $, $, a, n, o, n, f, u, n, $, 1) ,而不是$line4.$read$$iw$$iw$$anonfun$1。但是为什么Scala REPL会像这样打印出来?所有可执行的Scala代码都必须位于类,特征或对象定义中。因此,当您在REPL中输入一行而不是它时,它将被包含在$anonfun$1内。显然,在打印答案时,REPL会抑制任何看起来像此对象生成的名称的一部分,即使它不是来自它的位置:

object

并且scala> "a$$iw$$b" res7: String = a$$b 符合此抑制条件,但$line4.$read$本身没有。