Ruby to Scala代码转换

时间:2018-05-12 23:08:25

标签: ruby scala

我正在将一些代码从Ruby转换为Scala。问题是我从未在我的生活中编写Ruby。它进展顺利,但现在我达到了两条我不明白的路线。 如何将最后2条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]]

1 个答案:

答案 0 :(得分:2)

另一个答案是好的,但我相信代码可以更简单。 Ruby代码非常糟糕(不仅如此,它甚至在语法上都是非法的!),我根本不会尝试翻译它,重写它而不是翻译它可能要好得多。

您要问的两个特定线路只是一种非常复杂的写作方式

min, max = pop.minmax_by { |x| x[:objectives][i] }

但是,由于minmax是块的局部变量,它们会在块的末尾立即超出范围,并且因为它们不在其他任何地方使用,所以整个循环实际上只是一个无操作。 (除非Enumerable#minEnumerable#maxHash#[] / Array#[]被覆盖以产生某种副作用,否则真的奇怪。 )

Integer#times评估为self,因此整个事情实际上只相当于:

pop.first[:objectives].size

Scala等效于

pop.head('objectives).size

但是真的,你发布的Ruby代码在语法上是无效的,所以事实上它根本不是Ruby代码,而且没有Scala等价物。