2016-07-15 1 views
3

Это что-то интересное, которое я заметил сегодня во время игры Scala REPL в IntelliJ.Почему идентичные объекты получают разные печатные выходы в IntelliJ Scala REPL в зависимости от того, как они были созданы?

Учитывая эти две линии:

val myVector = Vector.tabulate(10)((x: Int) => x + 1) 
val myVector2 = (1 to 10).toVector 

В REPL печатает:

myVector: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 
myVector2: Vector[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 

Почему первое шоу весь путь (scala.collection.immutable.Vector [Int]), в то время как второй - это только Vector [Int]?

Чтобы покрыть все основания, я подтвердил, что они действительно являются тем же классом:

myVector: Class[?0] = class scala.collection.immutable.Vector 
myVector2: Class[?0] = class scala.collection.immutable.Vector 

Это больше любопытства, чем ничего, но это может быть запутанным для новичков, которые, скорее всего, использовать РЕПЛ.

ответ

2

Вы можете получить подробную информацию типа:

$ scalam 
Welcome to Scala 2.12.0-M5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92). 
Type in expressions for evaluation. Or try :help. 

scala> :type -v Vector.tabulate(10)((x: Int) => x + 1) 
// Type signature 
scala.collection.immutable.Vector[Int] 

// Internal Type structure 
TypeRef(
    TypeSymbol(
    final class Vector[+A] extends AbstractSeq[A] with IndexedSeq[A] with GenericTraversableTemplate[A,scala.collection.immutable.Vector] with IndexedSeqLike[A,scala.collection.immutable.Vector[A]] with VectorPointer[A @scala.annotation.unchecked.uncheckedVariance] with Serializable with CustomParallelizable[A,scala.collection.parallel.immutable.ParVector[A]] 

) 
    args = List(
    TypeRef(TypeSymbol(final abstract class Int extends AnyVal)) 
) 
) 

scala> :type -v (1 to 10).toVector 
// Type signature 
Vector[Int] 

// Internal Type structure 
AliasTypeRef(
    Alias(type Vector[+A] = scala.collection.immutable.Vector[A]) 
    args = List(
    TypeRef(TypeSymbol(final abstract class Int extends AnyVal)) 
) 
    normalize = TypeRef(
    TypeSymbol(
     final class Vector[+A] extends AbstractSeq[A] with IndexedSeq[A] with GenericTraversableTemplate[A,scala.collection.immutable.Vector] with IndexedSeqLike[A,scala.collection.immutable.Vector[A]] with VectorPointer[A @scala.annotation.unchecked.uncheckedVariance] with Serializable with CustomParallelizable[A,scala.collection.parallel.immutable.ParVector[A]] 

    ) 
    args = List(
     TypeRef(TypeSymbol(final abstract class Int extends AnyVal)) 
    ) 
) 
) 

Вы могли бы сказать, как я, "? Wha"

В TraversableOnce.toVector имеет тип scala.Vector:

def toVector: Vector[A] = to[Vector] 

Метод tabulate завод находится на GenTraversableFactory поэтому я туда не пойду. Но, очевидно, тип возврата, который может быть типом arg, встряхивается как неустановленный Вектор.

Следует добавить, что они ищут персонализированную печать значений, а также типов. И есть comment on the :type command, чтобы добавить вариант нормализации типов, чтобы избежать этой проблемы.

Кроме того, здесь хороший один:

scala> Vector 
res0: collection.immutable.Vector.type = [email protected] 
+1

Это отличный ответ @ сома-snytt. Спасибо, сегодня я узнал что-то новое. –

Смежные вопросы