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'。
答案 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$
本身没有。