2012-02-25 26 views
6

Tôi đã thử điều này trong scala 2.9.1 và scala 2.10 M2.scala generics và giao diện điều khiển tự động hoàn thành

Dưới đây là bảng điểm scala của tôi sau khi chạy lệnh scala từ nhà ga:

 
scala> case class Person(val name: String) 
defined class Person 

scala> val friends = List(Person("Fred")) 
friends: List[Person] = List(Person(Fred)) 

scala> friends.head.TAB 
asInstanceOf isInstanceOf toString  

scala> friends.head.name 
res0: String = Fred 

scala> :t friends 
List[Person] 

scala> :t friends.head 
Person 

Scala biết rằng bạn bè là các loại List [Người] và friends.head đó là kiểu Person. Không nên nó có thể đề xuất tên như là một hoàn thành tiềm năng?

Nếu điều đó không được hỗ trợ, tôi rất sẵn lòng xem xét khắc phục sự cố. Tôi nhìn trộm xung quanh trong mã nguồn (scala-2.9.1.final-sources/src/jline/src/main/java/scala/công cụ/jline/console/completer) nhưng tôi đánh giá cao bất kỳ con trỏ để làm thế nào để sửa chữa nó .

Cảm ơn.

Tim

Trả lời

7

Bạn nói đúng, nó không được hỗ trợ. Tiền tố (friends.head) không thực sự chạy qua trình kiểm tra loại để xác định loại chính xác.

Nếu bạn muốn chơi với điều này, bạn nên sử dụng phiên bản Scala mới nhất và chạy với -Dscala.repl.debug để xem điều gì đang xảy ra.

scala> ps.head. 
complete(ps.head., 8) last = (, -1), verbosity: 0 
List[$read$$iw$$iw$Person] completions ==> List(removeDuplicates, toStream, stringPrefix, reverse, span, dropWhile, takeWhile, splitAt, takeRight, slice, drop, take, toList, +:, ++, mapConserve, reverse_:::, :::, ::, companion, lastIndexWhere, indexWhere, segmentLength, isDefinedAt, lengthCompare, sameElements, dropRight, last, reduceRight, reduceLeft, foldRight, foldLeft, find, count, exists, forall, foreach, apply, length, productPrefix, productIterator, seq, corresponds, iterator, toSeq, toString, view, indices, sorted, sortBy, sortWith, padTo, :+, updated, patch, distinct, intersect, diff, union, contains, containsSlice, lastIndexOfSlice, indexOfSlice, endsWith, startsWith, reverseIterator, reverseMap, combinations, permutations, size, lastIndexOf, indexOf, prefixLength, lift, andThen, orElseFast, orElse, compose, canEqual, zipWithIndex, zipAll, zip, copyToArray, sliding, grouped, head, toIterator, toIterable, isEmpty, transpose, flatten, unzip3, unzip, genericBuilder, withFilter, toTraversable, inits, tails, init, lastOption, tail, headOption, scanRight, scanLeft, scan, groupBy, partition, collect, filterNot, filter, flatMap, map, ++:, hasDefiniteSize, repr, isTraversableAgain, par, addString, mkString, toMap, toSet, toBuffer, toIndexedSeq, toArray, copyToBuffer, minBy, maxBy, max, min, product, sum, aggregate, fold, reduceOption, reduce, reduceRightOption, reduceLeftOption, :\, /:, collectFirst, nonEmpty, /:\, asInstanceOf, isInstanceOf, productArity, productElement) 
List[$read$$iw$$iw$Person] -> 'head' ==> Some(()Object (31 members)) 
()Object completions ==> List(toString, asInstanceOf, isInstanceOf) 
package <root> completions ==> List(target, project, lib_managed, quicktime, ch, scala, apple, java, com, sunw, javax, sun, org, asInstanceOf, isInstanceOf, toString) 
package <root> -> 'ps' ==> None 
object Predef -> 'ps' ==> None 
package scala -> 'ps' ==> None 
package java.lang -> 'ps' ==> None 
tryCompletion(Parsed(ps.head./8), _) lastBuf = ps.head., lastCursor = 8, p.position = 8 

asInstanceOf isInstanceOf toString 

Có thể bạn nên tìm lời khuyên của Paul Phillips, tác giả REPL. Tôi chắc chắn rằng anh ta được xem xét (nếu không được thực hiện một nửa) điều này đã có, và sẽ biết những khó khăn tốt hơn so với bất cứ ai khác.

+1

+1 cho '-Dscala.repl.debug'. Nó có lẽ có thể được thiết lập từ bên trong repl là tốt, phải không? –

Các vấn đề liên quan