обобщенные скалы и автоматическое заполнение консоли - PullRequest
6 голосов
/ 25 февраля 2012

Я пробовал это в scala 2.9.1 и scala 2.10 M2.

Вот моя расшифровка стенограммы после запуска команды scala из терминала:

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 знает, что у друзей есть тип List [Person] и что friends.head имеет тип Person. Разве он не должен быть в состоянии предложить имя в качестве потенциального завершения?

Если это не поддерживается, я был бы рад разобраться с этим. Я заглянул в исходный код (scala-2.9.1.final-sources / src / jline / src / main / java / scala / tools / jline / console / complete), но я был бы признателен за любые указания, как это исправить .

Спасибо.

Тим

1 Ответ

7 голосов
/ 25 февраля 2012

Вы правы, это не поддерживается. Префикс (friends.head) на самом деле не проходит проверку типов для определения точного типа.

Если вы хотите поиграть с этим, вы должны использовать последнюю версию Scala и запустить с -Dscala.repl.debug, чтобы увидеть, что происходит.

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   

Возможно, вам следует обратиться за советом к Полу Филлипсу, автору REPL. Я уверен, что он уже обдумал (если не наполовину реализовал) это и знает о трудностях лучше, чем кто-либо другой.

...