10

在阅读 Cay S. Horstmann 的“不耐烦的 Scala”时,我注意到第一章的第一个练习揭示了一些有趣的东西。

  1. 在 Scala REPL 中,键入 3. 后跟 Tab 键。可以应用哪些方法?

当我这样做时,我得到以下信息

斯卡拉> 3。
% & * + - /              
> >= >> >>> ^ asInstanceOf   
isInstanceOf toByte toChar toDouble toFloat toInt          
toLong toShort toString unary_+ unary_- unary_~        
|       

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

斯卡拉> 3。
!= ## % & * +              
- / >= >> >>> ^ asInstanceOf   
等于 getClass hashCode isInstanceOf toByte toChar         
toDouble toFloat toInt toLong toShort toString       
一元_+ 一元_- 一元_~ |    

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

4

1 回答 1

12

在 REPL 中按两次制表符会提高完成的详细程度

如果 "methodName" 在z的完成中,并且verbosity > 0指示选项卡已连续按下两次,则我们调用alternativesFor 并显示重载方法签名列表。

解释器源中的以下方法指示在何时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 _))
)

因此,通过一个选项卡,您将获得由解释器开发人员认为合理且有用的一些规则过滤的方法。两个选项卡为您提供未经过滤的版本。

于 2012-05-06T18:14:42.363 回答