什么是Scala REPL的标签完成告诉我这里?

时间:2012-05-06 17:33:48

标签: scala read-eval-print-loop tab-completion scala-2.9

在探索Cay S. Horstmann的“不耐烦的斯卡拉”时,我注意到第一章第一次练习所揭示的一些有趣的东西。

  1. 在Scala REPL中,键入3.然后按Tab键。可以采用哪些方法?
  2. 当我这样做时,我得到以下

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

    但我注意到,如果我第二次点击Tab,我会得到一个略有不同的列表。

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

    REPL试图在这里告诉我什么?第二次出现的不同方法有什么特别之处吗?

1 个答案:

答案 0 :(得分:11)

在REPL raises the verbosity of the completion中点击标签两次:

  

如果“methodName”在z的完成中,并且verbosity > 0表示   选项卡已连续按两次,然后我们拨打alternativesFor   并显示重载方法签名列表。

interpreter source中的以下方法表示在verbosity == 0时(例如,当您只点击一次标签而未获得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 _))
)

因此,使用一个选项卡,您可以通过某些规则筛选方法,而解释程序开发人员已经确定这些规则是合理且有用的。两个选项卡为您提供未经过滤的版本。