2017-02-06 4 views
1

Ich versuche zu verstehen, wie Future funktioniert und ich stieß auf seine apply(). Die api sagt dies über die apply()apply() Rückgabe des gleichen Objekts

Startet eine asynchrone Berechnung und gibt ein Future Objekt mit das Ergebnis dieser Berechnung

ich es besser, indem ein einfaches Objekt, verstehen wollte Willen deren Anwendung Rückgabe des gleichen Objekts mit geänderten Feldern Betrachten wir zum Beispiel den folgenden Code:

object Rough extends App { 
    trait Sample 

    object Sample { 
    var x: Int = 0 
    def apply[T](body: => T): String= { 
     "Hello " + body 
    } 
    } 

    val s: String = Sample.apply("World") 

    print(s) 
} 

die Gerade jetzt gilt ein String zurück. Ich möchte es Sample[Int] zurückgeben. Genauer gesagt möchte ich, dass apply()Sample[Int] zurückgibt, wobei der Int-Wert die Länge von Zeichenfolgen ist, die an die apply() übergeben wurde. Wie kann ich das machen?

Antwort

1

Sie scheinen über einige nicht verwandte Scala-Themen verwirrt zu sein.

Zunächst ist apply() nur eine Methode wie jede andere. Das Besondere ist, dass der Name beim Aufruf weggelassen werden kann. So ist Sample() nur eine bequeme Abkürzung für Sample.apply().

Wenn Sie jetzt eine Methode möchten, die das Singleton-Objekt zurückgibt, an das es angehängt ist, geben Sie einfach this zurück.

object Sample { // create a singleton object 
    var x: Int = 0 
    def apply(s: String): Sample.type = { 
    x = s.length // save some data 
    this   // return a reference to this object 
    } 
} 

val samp = Sample("Hi there") // invoke the 'apply()' method 
samp.x   // get the saved data --> res0: Int = 8 
+2

Und noch ist, dass „gibt ein' Future' Objekt“(oder„ein 'Sample' Objekt“) bedeutet nicht, es gibt „das gleiche Objekt“, dh die definierte Aufgabe durch 'Objekt Future', aber ein Objekt, das 'Trait Future [A]' erweitert. –

Verwandte Themen