2012-02-25 3 views
6

J'ai essayé ceci dans scala 2.9.1 et scala 2.10 M2.scala génériques et console auto complète

Voici mon relevé de notes scala après l'exécution de la commande scala du 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 sait que les amis est de type List [personne] et que friends.head est de type Personne. Ne devrait-il pas être en mesure de suggérer le nom comme un achèvement potentiel?

Si ce n'est pas pris en charge, je serais heureux de chercher à le réparer. J'ai jeté un coup d'œil dans le code source (scala-2.9.1.final-sources/src/jline/src/main/java/scala/tools/jline/console/completer) mais j'apprécierais tout pointeur sur la façon de le réparer .

Merci.

Tim

Répondre

7

Vous avez raison, ce n'est pas pris en charge. Le préfixe (friends.head) n'est pas réellement exécuté par le vérificateur de type pour déterminer le type précis.

Si vous voulez jouer avec cela, vous devez utiliser la dernière version de Scala et l'exécuter avec -Dscala.repl.debug pour voir ce qui se passe.

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 

Vous devriez probablement demander conseil à Paul Phillips, l'auteur de REPL. Je suis sûr qu'il est déjà considéré (si ce n'est à moitié mis en œuvre) et qu'il connaîtrait mieux la difficulté que quiconque.

+1

+1 pour '-Dscala.repl.debug'. Il peut probablement être défini depuis l'intérieur de repl, n'est-ce pas? –