2012-05-06 42 views
9

Trong khi làm việc theo cách của tôi thông qua "Scala for the Impatient" của Cay S. Horstmann, tôi nhận thấy một điều gì đó thú vị được tiết lộ trong bài tập đầu tiên trong chương đầu tiên.Hoàn thành tab của Scala REPL cho tôi biết điều gì ở đây?

  1. Trong REPAL REPL, hãy nhập 3. tiếp theo là phím Tab. Phương pháp nào có thể được áp dụng?

Khi tôi làm điều này, tôi nhận được sau

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

Nhưng tôi nhận thấy rằng nếu tôi nhấn Tab lần thứ hai, tôi nhận được một danh sách hơi khác nhau.

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

REPL đang cố gắng cho tôi biết điều gì ở đây? Có điều gì đặc biệt về các phương pháp khác nhau xuất hiện lần thứ hai không?

Trả lời

11

tab Hitting hai lần trong REPL raises the verbosity of the completion:

Nếu "methodName" là một trong những z 's hoàn tất, và verbosity > 0 chỉ tab đã được ép hai lần liên tiếp, sau đó chúng ta gọi là alternativesFor và hiển thị một danh sách các chữ ký quá tải phương thức.

Các phương pháp sau đây từ interpreter source hiện những gì được lọc để hoàn thành phương pháp khi verbosity == 0 (ví dụ, khi bạn đã chỉ tab nhấn một lần và không nhận được phiên bản 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 _)) 
) 

Vì vậy, với một tab bạn sẽ nhận được các phương thức được lọc theo một số quy tắc mà các nhà phát triển trình thông dịch đã quyết định là hợp lý và hữu ích. Hai tab cung cấp cho bạn phiên bản chưa được lọc.