2012-05-06 5 views
9

Cay S. Horstmann의 "참을성없는 사람들을위한 스칼라"를 진행하면서 첫 번째 장의 첫 번째 실습에서 흥미로운 점을 발견했습니다.스칼라 REPL의 탭 완성으로 어떤 점이 나에게 알려 줍니까?

  1. 스칼라 REPL에서 Tab 키를 누른 다음 3을 입력하십시오. 어떤 방법을 적용 할 수 있습니까? 나는이 작업을 수행 할 때

, 나는 다음과 같은

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

얻을하지만 내가 탭을 한 번 치면, 나는 약간 다른 목록을 얻을 것으로 나타났습니다.

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

여기에 나와있는 REPL은 무엇입니까? 두 번째로 나타나는 여러 가지 방법에 대해 특별한 것이 있습니까?

답변

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 _)) 
) 

을 하나의 탭은 인터프리터 개발자가 결정한 몇 가지 규칙에 따라 필터링 된 메서드를 얻고 있으며 합리적이고 유용합니다. 두 개의 탭은 필터링되지 않은 버전을 제공합니다.