2011-07-22 49 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

啊,是的,你說得對。 –

相關問題