2011-07-22 10 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") 
... 

Esto se repite unas cuantas docenas de veces ....¿Por qué invokeDynamic en una clase que extiende Dynamic no funciona?

... 
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 

Y así sucesivamente ... hasta que finalmente:

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

Parece que se ha perdido :) –

+0

Elija 'y' aquí. :) –

+0

En serio: lo compilaría desde fuera del REPL, para ver si todavía se comporta mal. En algunos reagards, el REPL funciona de manera diferente (no se ve ningún objeto externo). –

Respuesta

4

de que se estrelle el compilador porque no puede encontrar la derecha método para manejar su código. Acepto que no debe bloquear el compilador, pero debe devolver un mensaje de error útil en su lugar.

Tenga en cuenta que funciona correctamente con el nombre de método correcto 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

Gracias, supongo que cambiaron el nombre del método, porque hay algunas publicaciones antiguas que hablan de 'invokeDynamic'. –

+0

@Kim sí, el nombre cambió, y los blogs no lo hicieron. Eso fue muy desafortunado. –

1

muy raro. Creo que no debería compilarse, porque se supone que debes implementar applyDynamic y no invokeDynamic. Esta funciona para mí:

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

Probablemente invokeDynamic alguna manera se mete con el material sintético ...?

+0

No es el nombre del método. El problema es simplemente que 'applyDynamic' no está allí. También se bloqueará sin ningún método, e. gramo. 'La clase D se extiende dinámica' – soc

+0

Ah, sí, tienes razón. –

Cuestiones relacionadas