2015-06-01 18 views
5

Guardando questa domanda, Fill immutable map with for loop upon creation, ero curioso di sapere cosa significa this in Map(1 -> this).`this` Digitare in Scala

scala> Map(1 -> this) 
res6: scala.collection.immutable.Map[Int,type] = Map(1 -> @53e28097) 

scala> res6(1) 
res7: type = @53e28097 

Non ho visto prima type come tipo.

Che cos'è?

+0

+1, perché anche se inizialmente pensavo che sarebbe stata una semplice risposta "è solo un riferimento allo scopo attuale", sono stato completamente in grado di capire che cosa è per me stesso. Questo non è aiutato da quanto sia difficile per google ciò che "questo" è in Scala. – KChaloux

risposta

2

Sembra un po 'strano nel REPL, ma se si compila o interpreta effettivamente uno script, this sembra infatti puntare all'istanza corrente dell'oggetto che lo racchiude.

import scala.reflect.runtime.{ universe => ru } 

object Main { 
    def getType[T : ru.TypeTag](instance: T) = ru.typeOf[T] 

    def sayHello = println("hello!") 

    def main(args: Array[String]): Unit = { 
    println(this.getType(123)) // Prints "Int" 
    this.sayHello    // Prints "hello!" to the console 

    getType(this).decls foreach println _ 
    // Prints the following outputs to the console: 
    // constructor Main 
    // method getType 
    // method sayHello 
    // method main 
    } 
} 

Per quanto riguarda il motivo per cui non presenta questo comportamento nella REPL, non sono sicuro.

+1

"Per quanto riguarda il motivo per cui non mostra questo comportamento nella REPL, non sono sicuro". Lo fa. Prova a incollare il codice nel REPL e poi a "Main.main (Array.empty)", otterrai lo stesso risultato (in altre parole, "thid" si riferirà anche a "Main" nel REPL). Tuttavia, se si fa riferimento a 'this' in una dichiarazione di livello superiore nel REPL,' this' si riferirà effettivamente alla classe/oggetto che racchiude, che in questo caso risulta essere un oggetto wrapper creato dal REPL per ospitare la dichiarazione (vedere http://stackoverflow.com/questions/11549174/trying-to-understand-how-classes-declared-on-the-repl-are-treat-internally) –

+1

Per quanto riguarda dove il 'type' sta arrivando, il mio (puro ipotesi) è che proviene dal REPL cercando di ripulire il tipo effettivo. Poiché il codice si trova in un oggetto wrapper chiamato qualcosa come $ iw, quando si dichiara una classe/tratto 'Foo' nel repl, il tipo effettivo sarà qualcosa come' iw.Foo', ma in realtà non si vuole conosci '$ iw' quindi il REPL rimuove il prefisso' $ iw' e stampa solo 'Foo'. Nel caso dell'OP, 'this' ha tipo' $ iw.type', quindi rimuovere '$ iw' lascia semplicemente' type', che sfortunatamente non è un tipo reale. Quindi questo sarebbe solo un caso d'angolo del REPL che cerca di essere gentile con te. –