我正在把一些代码从ruby转换成scala。问题是我这辈子从来没有编程过Ruby进展顺利,但现在我遇到了两条我不明白的线。
如何将最后两行Ruby转换成Scala?

  num_obs = pop.first[:objectives].size
  num_obs.times do |i|
    min = pop.min{|x,y| x[:objectives][i]<=>y[:objectives][i]}
    max = pop.max{|x,y| x[:objectives][i]<=>y[:objectives][i]}
    /* do sth. with min and max */
  end

pop是vector[map[string,any]]

最佳答案

整个|x,y| f(x) <=> f(y)事件似乎只是通过一些属性来比较xy,而f返回<=>如果我们不提供返回值-1, 0, 1compare方法,而只通过-1, 0, 1进行比较,同样的事情可以更容易地表达出来。在scala中,可能是这样的:

val pop: Vector[Map[String, Any]] = ???
val num_obs: Int = ???
for (i <- 0 until num_obs) {
  val min = pop.minBy(_("objectives").asInstanceOf[Vector[Int]](i))
  val max = pop.maxBy(_("objectives").asInstanceOf[Vector[Int]](i))
  /* do sth. with min and max */
}

注意,我已经用字符串替换了symbolsf,尽管Scala也有:objectives-type(对应的符号是Symbol)我还假设图中的值类似于整数向量(索引为'objectives没有任何意义)。

10-06 05:55