scala - 如何在循环内为这些向量调用方法?
问题描述
我正在尝试在 Atomic Scala 中做总结二的练习之一。
为什么以下代码运行良好
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> 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
因为只有相等而不是相等运算符,我们不了解正确的排序是什么。
推荐阅读
- r - R - 根据第一次出现的列值返回 df 中行的第一个值
- bash - 如何在 Bash 脚本中使用 Kubernetes Secret
- python-3.x - 使用数据框的散景水平分组条形图
- entity-framework - Efcore 2.2- where 子句在选择后运行并返回错误结果
- javascript - 无法从其他模块或领域使用 GraphQLSchema
- php - 如何在迁移中使用内部联接更新 Laravel 数据库
- c# - 当 WindowState 设置为最大化时,部分表单会消失
- web - 如何以图形方式选择自己网站之外的页面上的元素
- javascript - 使用 Angular 7 滚动水平活动项目
- java - 如何避免 .getSelectedFile() 过早选择?