【问题标题】:Ruby to Scala code translationRuby 到 Scala 代码翻译
【发布时间】:2018-05-13 09:01:54
【问题描述】:

我正在将一些代码从 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]]

【问题讨论】:

  • 什么是i?它是否绑定到当前范围内的任何内容?虽然我绝不是 Ruby 专家,但 :objectives 看起来更像是一个符号,所以对应的 Scala 类型应该是 Vector[Map[Symbol, Any]]
  • 是的,但在我的 scala 代码中,我使用的是 Vector[Map[String, Any]]

标签: ruby scala


【解决方案1】:

整个|x,y| f(x) &lt;=&gt; f(y) 似乎只是通过某些属性f 比较xy,而&lt;=&gt; 返回-1, 0, 1。如果我们不提供返回值-1, 0, 1compare 方法,而是简单地通过f 进行比较,那么同样的事情可以更容易地表达出来。在 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 */
}

请注意,我已将符号 :objectives 替换为字符串,尽管 Scala 也有 Symbol 类型(对应的符号将是 'objectives)。我还假设地图中的值类似于整数向量(否则使用i 进行索引没有任何意义)。

【讨论】:

  • 首先谢谢你,我会试试的,但现在我有一个问题。最大值和最小值是什么数据类型?因为下一行是 rge = max[:objectives][i] - min[:objectives][i] 所以我认为 max 和 min 也应该是 Vectors
  • @flyist Map[String, Any],我猜...如果这根本没有任何意义,那么我将不得不再看一下 ruby​​ 文档。变量min 类似于“向量:objectives 的最小i-th 分量的映射”。变量minmax 应该不是是向量,它们应该是映射,否则你不能访问它们的:objectives 组件。
  • 完全正确。我想你解决了。非常感谢!
  • @SimpleLime 是 # 类似于身份函数,=&gt; 是您自己的 “评估为” 的非正式表示法?如果pop 是一个带有Map[String, Any] 类型映射的向量,那么minmax 也应该是Map[String, Any],如果我理解正确的话。
  • 我刚刚检查了 min 和 max 是 Map[String, Any]max("objectives") 是一个向量。这就是为什么这对我有用。谢谢兄弟。
【解决方案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 等价物。

【讨论】:

  • “因为它们没有在其他任何地方使用,所以整个循环实际上只是一个无操作”:由于 end 不可见,我假设该块不会在这两行之后结束。该问题的早期版本仅包含最后两行,直到我问i 应该是什么。所以,显然是不完整的。是不是不能扩展成语法有效的代码?
  • 有无数种不同的方法可以使它在语法上有效,每种方法对 Scala 都有不同的翻译。其中一种可能性是问题中的行后面缺少end,在这种情况下,我的答案减去最后一段。 Integer#times 仅对传递给它的块的副作用有用,因为它只是评估为 self,但 OP 显示的块没有副作用。
猜你喜欢
  • 2018-10-23
  • 2012-11-25
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多