2011-07-22 51 views
5
$ scala -Xexperimental 
Welcome to Scala version 2.9.0.1 (OpenJDK Server VM, Java 1.6.0_22). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> class D extends Dynamic { 
    | def invokeDynamic(s:String)(args:Any*) = println(s) 
    | def doo() = { this hello } 
    | } 
dynatype: this.applyDynamic("hello")() 
dynatype: this.applyDynamic("applyDynamic") 
... 

这重复了几十倍....为什么在扩展Dynamic的类中invokeDynamic不起作用?

... 
dynatype: this.applyDynamic("applyDynamic") 
java.lang.StackOverflowError 
    at  scala.tools.nsc.symtab.Types$TypeMap$$anonfun$mapOverArgs$1.apply(Types.scala:3107) 
    at scala.tools.nsc.symtab.Types$TypeMap$$anonfun$mapOverArgs$1.apply(Types.scala:3103) 
    at scala.tools.nsc.symtab.Types$class.map2Conserve(Types.scala:4867) 
    at scala.tools.nsc.symtab.SymbolTable.map2Conserve(SymbolTable.scala:13) 
    at scala.tools.nsc.symtab.Types$TypeMap.mapOverArgs(Types.scala:3103) 
    at scala.tools.nsc.symtab.Types$TypeMap.mapOver(Types.scala:3010) 
    at scala.tools.nsc.symtab.Types$ApproximateDependentMap$.apply(Types.scala:3594) 
    at scala.tools.nsc.symtab.Types$ApproximateDependentMap$.apply(Types.scala:3591) 
    at scala.tools.nsc.symtab.Types$TypeMap$$anonfun$16.apply(Types.scala:3125) 
    at scala.tools.nsc.symtab.Types$TypeMap$$anonfun$16.apply(Types.scala:3122) 
    at scala.collection.LinearSeqOptimized$class.exists(LinearSeqOptimized.scala:79) 
    at scala.collection.immutable.List.exists(List.scala:45) 
    at scala.tools.nsc.symtab.Types$TypeMap.mapOver(Types.scala:3122) 
    at scala.tools.nsc.symtab.Types$TypeMap.mapOver(Types.scala:3024) 
    at scala.tools.nsc.symtab.Types$ApproximateDependentMap$.apply(Types.scala:3594) 
    at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.scala$tools$nsc$typechecker$Implicits$ImplicitSearch$$depoly(Implicits.scala:261) 
    at scala.tools.nsc.typechecker.Implicits$ImplicitSearch$ImplicitComputation.survives(Implicits.scala:619) 
    at scala.tools.nsc.typechecker.Implicits$ImplicitSearch$ImplicitComputation$$anonfun$6$$anonfun$7.apply(Implicits.scala:648) 
    at scala.tools.nsc.typechecker.Implicits$ImplicitSearch$ImplicitComputation$$anonfun$6$$anonfun$7.apply(Implicits.scala:648) 
    at scala.collection.TraversableLike$$anonfun$filter$1.apply(TraversableLike.scala:213) 
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59) 
    at scala.collection.immutable.List.foreach(List.scala:45) 
    at scala.collection.TraversableLike$class.filter(TraversableLike.scala:212) 
    at scala.collection.immutable.List.filter(List.scala:45) 
    at scala.tools.nsc.typechecker.Implicits$ImplicitSearch$ImplicitComputation$$anonfun$6.apply(Implicits.scala:648) 
    at scala.tools.nsc.typechecker.Implicits$ImplicitSearch$ImplicitComputation$$anonfun$6.apply(Implicits.scala:647) 
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:200) 
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:200) 
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59) 
    at scala.collection.immutable.List.foreach(List.scala:45) 
    at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:200) 
    at scala.collection.immutable.List.flatMap(List.scala:45) 
    at scala.tools.nsc.typechecker.Implicits$ImplicitSearch$ImplicitComputation.<init>(Implicits.scala:647) 
    at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.searchImplicit(Implicits.scala:753) 
    at scala.tools.nsc.typechecker.Implicits$ImplicitSearch.bestImplicit(Implicits.scala:1084) 
    at scala.tools.nsc.typechecker.Implicits$class.inferImplicit(Implicits.scala:57) 
    at scala.tools.nsc.Global$analyzer$.inferImplicit(Global.scala:347) 
    at scala.tools.nsc.typechecker.Typers$Typer.wrapImplicit$1(Typers.scala:167) 
    at scala.tools.nsc.typechecker.Typers$Typer.inferView(Typers.scala:171) 
    at scala.tools.nsc.typechecker.Typers$Typer.adaptToMember(Typers.scala:985) 
    at scala.tools.nsc.typechecker.Typers$Typer.adaptToMemberWithArgs(Typers.scala:1024) 
    at scala.tools.nsc.typechecker.Typers$Typer.typedSelect$1(Typers.scala:3534) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:4123) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4217) 
    at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$typedApply$1$1.apply(Typers.scala:3326) 
    at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$typedApply$1$1.apply(Typers.scala:3326) 
    at scala.tools.nsc.typechecker.Typers$Typer.silent(Typers.scala:623) 
    at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:3326) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:4062) 
    at scala.tools.nsc.typechecker.Typers$Typer.typedSelect$1(Typers.scala:3554) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:4123) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4217) 
    at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$typedApply$1$1.apply(Typers.scala:3326) 
    at scala.tools.nsc.typechecker.Typers$Typer$$anonfun$typedApply$1$1.apply(Typers.scala:3326) 
    at scala.tools.nsc.typechecker.Typers$Typer.silent(Typers.scala:623) 
    at scala.tools.nsc.typechecker.Typers$Typer.typedApply$1(Typers.scala:3326) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:4062) 
    at scala.tools.nsc.typechecker.Typers$Typer.typedSelect$1(Typers.scala:3554) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:4123) 
    at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4217) 
    at 

等等......直到最后:

The repl compiler has crashed spectacularly. Shall I replay your 
session? I can re-run all lines except the last one. 
[y/n] 
+0

它看起来好像丢了:) –

+0

在这里选择'y'。 :) –

+0

说真的:我会从REPL之外编译它,看看它是否仍然存在错误。在一些reagards中,REPL工作不同(不可见外部对象)。 –

回答

4

它崩溃的编译器,因为它无法找到合适的方法来处理你的代码。 我同意它不应该使编译器崩溃,而应该返回一个有用的错误消息。

注意,它用正确的方法名applyDynamic正常工作:

scala> class D extends Dynamic { 
     def applyDynamic(s: String)(i: Int) { 
      println("Called "+ s +" with "+ i) 
     } 
     } 
defined class D 

scala> val d = new D 
d: D = [email protected] 

scala> d hello 42 
dynatype: $line33.$read.$iw.$iw.d.applyDynamic("hello") 
Called hello with 42 
+0

谢谢,我想他们改变了方法名称,因为有一些旧的博客文章讨论了'invokeDynamic'。 –

+0

@金是的,名称改变了,博客没有。这是最不幸的。 –

1

非常怪异。我认为它不应该编译,因为你应该执行applyDynamic而不是invokeDynamic。这一次对我的作品:

class D extends Dynamic { 
    def applyDynamic(s: String)(args: Any*) = println(s) 
    def doo() = { this.hello } 
} 

大概invokeDynamic某种方式与合成的东西弄乱...?

+0

这不是方法名称。问题在于'applyDynamic'不存在。它也会在没有任何方法的情况下崩溃, G。 'D类延伸动态' – soc

+0

啊,是的,你说得对。 –

相关问题