2012-05-06 8 views
9

Mentre lavoravo alla "Scala per gli impazienti" di Cay S. Horstmann, ho notato qualcosa di interessante rivelato dal primo esercizio del primo capitolo.Qual è il completamento di tabulazione di Scala REPL che mi dice qui?

  1. Nella Scala REPL, digitare 3. seguito dal tasto Tab. Quali metodi possono essere applicati?

Quando faccio questo, ottengo il seguente

 
scala> 3. 
%    &    *    +    -   /    
>    >=    >>    >>>   ^   asInstanceOf 
isInstanceOf toByte   toChar   toDouble  toFloat  toInt   
toLong   toShort  toString  unary_+  unary_-  unary_~   
|  

ma ho notato che se ho colpito Tab una seconda volta, ottengo una lista leggermente diverso.

 
scala> 3. 
!=    ##    %    &    *    +    
-   /       >=    >>    >>>   ^   asInstanceOf 
equals   getClass  hashCode  isInstanceOf toByte   toChar   
toDouble  toFloat  toInt   toLong   toShort  toString  
unary_+  unary_-  unary_~  |  

Qual è il REPL che tenta di dirmelo qui? C'è qualcosa di speciale nei diversi metodi che appaiono la seconda volta?

risposta

11

scheda Colpire due volte nel REPL raises the verbosity of the completion:

Se "methodName" è tra z 's completamenti, e verbosity > 0 indicando scheda è stato premuto due volte consecutivamente, poi chiamiamo alternativesFor e mostrare un elenco di firme del metodo sovraccarico.

I seguenti metodi della interpreter source indicano ciò che è filtrato per il completamento metodo quando verbosity == 0 (vale a dire, quando hai scheda colpito solo una volta e non si ottiene la versione alternativesFor):

def anyRefMethodsToShow = Set("isInstanceOf", "asInstanceOf", "toString") 

def excludeEndsWith: List[String] = Nil 

def excludeStartsWith: List[String] = List("<") // <byname>, <repeated>, etc. 

def excludeNames: List[String] = 
    (anyref.methodNames filterNot anyRefMethodsToShow) :+ "_root_" 

def exclude(name: String): Boolean = (
    (name contains "$") || 
    (excludeNames contains name) || 
    (excludeEndsWith exists (name endsWith _)) || 
    (excludeStartsWith exists (name startsWith _)) 
) 

Quindi, con in una scheda si ottengono i metodi filtrati da alcune regole che gli sviluppatori dell'interprete hanno deciso sono ragionevoli e utili. Due schede ti danno la versione non filtrata.