2012-02-25 12 views
6

Intenté esto en scala 2.9.1 y scala 2.10 M2.scala generic y console auto complete

Aquí es mi transcripción Scala después de ejecutar el comando Scala desde el terminal:

 
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 sabe que los amigos es de tipo List [persona] y que friends.head es del tipo de persona. ¿No debería ser capaz de sugerir el nombre como posible finalización?

Si eso no es compatible, me gustaría repararlo. Eché un vistazo en el código fuente (scala-2.9.1.final-sources/src/jline/src/main/java/scala/tools/jline/console/completer) pero agradecería cualquier sugerencia sobre cómo solucionarlo .

Gracias.

Tim

Respuesta

7

Tienes razón, no es compatible. El prefijo (friends.head) no se ejecuta realmente a través del verificador de tipos para determinar el tipo exacto.

Si quiere jugar con esto, debe usar la última versión de Scala, y ejecutar con -Dscala.repl.debug para ver qué está pasando.

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 

Probablemente debería buscar el consejo de Paul Phillips, el autor REPL. Estoy seguro de que ya se consideró (si no medio implementado) esto, y conocería la dificultad mejor que nadie.

+1

+1 para '-Dscala.repl.debug'. Probablemente también se puede configurar desde dentro de repl, ¿verdad? –