Generics scala泛型和控制台自动完成

Generics scala泛型和控制台自动完成,generics,scala,autocomplete,console,Generics,Scala,Autocomplete,Console,我在Scala2.9.1和Scala2.10m2中试过这个 以下是从终端运行scala命令后我的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 is

我在Scala2.9.1和Scala2.10m2中试过这个

以下是从终端运行scala命令后我的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>案例类人员(val名称:字符串) 限定类人 scala>val friends=列表(个人(“Fred”)) 朋友:名单[人]=名单(人(弗雷德)) scala>friends.head.TAB asInstanceOf isInstanceOf toString scala>friends.head.name res0:String=Fred scala>:t朋友 名单[人] scala>:t friends.head 人 Scala知道friends是List[Person]类型,friends.head是Person类型。难道它不能把名字作为一个潜在的完成点吗

如果这不被支持,我很乐意研究修复它。我浏览了源代码(scala-2.9.1.final sources/src/jline/src/main/java/scala/tools/jline/console/completer),但如果有任何关于如何修复它的建议,我将不胜感激

谢谢


蒂姆

你说得对,它不受支持。前缀(
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   
scala>ps.head。
完整(ps.head.,8)最后=(,-1),详细程度:0
列表[$read$$iw$$iw$Person]完成==>List(删除的复制、toStream、stringPrefix、reverse、span、dropWhile、takeWhile、splitAt、takeRight、slice、drop、take、toList、+:、+、++、MapSave、reverse、reverse、toStream、stringPrefix、reverse、span、dropWhile、takeWhile、splitAt、takeRight、slice、DropleRight、ReduceEleft、foldRight、foldLeft、find、count、exists、,forall,foreach,apply,length,productPrefix,productIterator,seq,corresponder,iterator,toSeq,toString,view,index,sorted,sortWith,padTo,:+,updated,patch,distinct,intersection,diff,union,contains,containsSlice,lastinexofslice,indexOfSlice,endsWith,startsWith,reverseirator,reverseemap,compositions,permutations,s,size,lastIndexOf,indexOf,prefixLength,lift,然后,orElseFast,orElse,compose,canEqual,zipWithIndex,ZipPall,zip,copyToArray,Slide,grouped,head,toIterator,toIterable,isEmpty,transpose,Flatte,unzip3,unzip,genericBuilder,With Filter,toTraversable,inits,init,lastOption,tail,headOption,scanRight,scanLeft,scanLeft,scan,Gran,grOpBee、分区、集合、FieldNoT、MAP+、HAQuestiTeSeIZE、RePR、IttrueAvable、Par、AdSouthMKStin、ToMAP、ToMPET、ToStor、TootoXeDeSeq、ToSalm、CoptoFuffor、MimBy、Max、Min、Min、My、My、Sube、Posiy、ReopeOpple、RealEngopePosit、:nstanceOf、ISTANCEOF、productArity、productElement)
列表[$read$$iw$$iw$Person]->“head”==>一些(()对象(31个成员))
()对象完成==>List(toString、asInstanceOf、isInstanceOf)
包完成==>列表(目标、项目、库管理、quicktime、ch、scala、apple、java、com、sunw、javax、sun、org、asInstanceOf、isInstanceOf、toString)
软件包->“ps”==>无
对象Predef->“ps”==>无
软件包scala->“ps”==>无
包java.lang->“ps”==>无
tryCompletion(已解析(ps.head./8),)lastBuf=ps.head.,lastCursor=8,p.position=8
asInstanceOf isInstanceOf toString

您可能应该征求REPL作者Paul Phillips的建议。我相信他已经考虑过(如果没有一半实现的话)这一点,并且会比其他任何人都更清楚这一点。

+1 for
-Dscala.REPL.debug
。它可能也可以从REPL内部设置,对吗?