我正在将一些代码从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]]
答案 0 :(得分:2)
另一个答案是好的,但我相信代码可以更简单。 Ruby代码非常糟糕(不仅如此,它甚至在语法上都是非法的!),我根本不会尝试翻译它,重写它而不是翻译它可能要好得多。
您要问的两个特定线路只是一种非常复杂的写作方式
min, max = pop.minmax_by { |x| x[:objectives][i] }
但是,由于min
和max
是块的局部变量,它们会在块的末尾立即超出范围,并且因为它们不在其他任何地方使用,所以整个循环实际上只是一个无操作。 (除非Enumerable#min
或Enumerable#max
或Hash#[]
/ Array#[]
被覆盖以产生某种副作用,否则真的奇怪。 )
Integer#times
评估为self
,因此整个事情实际上只相当于:
pop.first[:objectives].size
Scala等效于
pop.head('objectives).size
但是真的,你发布的Ruby代码在语法上是无效的,所以事实上它根本不是Ruby代码,而且没有Scala等价物。