首页 > 解决方案 > 如何在循环内为这些向量调用方法?

问题描述

我正在尝试在 Atomic Sc​​ala 中做总结二的练习之一。

为什么以下代码运行良好

val chars = Vector('z', 'a', 'b')
val ints = Vector(0, 3, 7)
val strs = Vector("these", "are", "vectors")

println(chars.sorted)
println(ints.sorted)
println(strs.sorted)

但下面的下一个脚本给我一个错误.\Summary2.scala:7: error: No implicit Ordering defined for Any. println(v.sorted)

val chars = Vector('z', 'a', 'b')
val ints = Vector(0, 3, 7)
val strs = Vector("these", "are", "vectors")

for (v <- Vector(chars, ints, strs)){
    println(v.sorted)
}

顺便说一句,如果我只想打印每个向量,我可以遍历向量的向量。sorted只是在循环中不起作用。

val chars:Vector[Char] = Vector('z', 'a', 'b')
val ints:Vector[Int] = Vector(0, 3, 7)
val strs:Vector[String] = Vector("these", "are", "vectors")

for (v <- Vector(chars, ints, strs)){
    println(v)
    // println(v.sorted)
}

我得到这个输出

Vector(z, a, b)
Vector(0, 3, 7)
Vector(these, are, vectors)

这很基本,官方书籍解决方案是第一个脚本,但是第二个脚本不起作用真的很烦人。

标签: scala

解决方案


Scala 是一种强类型语言,因此在编译时编译器必须知道所有内容的类型才能创建正确的程序。

让我们看看 scala 认为你的向量类型是什么

scala> val chars = Vector('z', 'a', 'b')
chars: scala.collection.immutable.Vector[Char] = Vector(z, a, b)

scala> val strs = Vector("these", "are", "vectors")
strs: scala.collection.immutable.Vector[String] = Vector(these, are, vectors)

scala> val ints = Vector(0, 3, 7)
ints: scala.collection.immutable.Vector[Int] = Vector(0, 3, 7)

scala> val vs = Vector(chars, ints, strs)
vs: scala.collection.immutable.Vector[scala.collection.immutable.Vector[Any]] = Vector(Vector(z, a, b), Vector(0, 3, 7), Vector(these, are, vectors))

如您所见,您创建的用于迭代的向量具有类型

scala.collection.immutable.Vector[Any]

为了可排序,我们必须能够定义<, <=, >, >=,从类定义中可以看出Any,这种类型只实现!=, ==

因此,我们无法使用类型对对象进行排序,Any因为只有相等而不是相等运算符,我们不了解正确的排序是什么。

https://www.scala-lang.org/api/2.7.5/scala/Any.html


推荐阅读