【问题标题】:js.Function2, how to?js.Function2,怎么做?
【发布时间】:2017-01-05 22:35:36
【问题描述】:

我正在尝试将一些 d3.js 应用程序移植到 Scala.js,只是为了学习。但目前我有点卡住了。

JS:

var diagonal = d3.svg.diagonal()
        .projection(function(d) { return [d.y, d.x]; });

如何将其转换为 scala.js?我知道我需要js.Function2[Node, Double, js.Tuple2[Double,Double],但我不知道如何制作它。

对于js.Function1,这很简单,就像这样:

private def test: (Event) => Unit = (e: dom.Event) => {
    ()
}

使用"org.singlespaced" %%% "scalajs-d3" % "0.3.3"

【问题讨论】:

  • "我知道我需要js.Function2[Node, Double, js.Tuple2[Double,Double]" 你从哪里知道的?您是否为 d3.js 使用了一些特定的 Scala.js 库? projection的定义是什么?从 JS 代码来看,它在我看来更像是 js.Function1[Point, js.Tuple2[Double, Double]]。如果你真的像你说的那样需要js.Function2,它应该有{ (node: Node, dbl: Double) => js.Tuple2(someX, someY) }的形式

标签: scala d3.js higher-order-functions scala.js


【解决方案1】:

基本一样,只是需要两个参数。与您的示例同源的是:

private val test2: (Node, Double) => js.Tuple2[Double, Double] = (n:Node, d:Double) => {
    (1.2, 3.5)
}

虽然更典型的说法是:

private def test2(n:Node, d:Double):js.Tuple2[Double, Double] = {
    (1.2, 3.5)
}

内联,它会是 something 像:

val diagonal = d3.svg.diagonal()
        .projection((n:Node, d:Double) => js.Tuple2(something.y, something.x));

“某事”是因为我不明白您的 JS 示例是如何以js.Function2 出现的——Function2 需要 2 个参数,而您的示例仅显示 1。x 和 @987654327 Node的@字段?

【讨论】:

  • 我试过 val diagonal = d3.svg.diagonal().projection((n: Node, d: Double) => (d, d)) 很遗憾,这给了我:Type mismatch, expected: Function2[Node, Double, Tuple2[Double, Double]], actual (dom.Node, Double) => (Double, Double)
  • 根据上面@sjrd 的评论(谁比我更了解系统),听起来我们对隐式转换器的期望过高。试着做最后一点js.Tuple2(d, d)——我会这样编辑我的答案。
猜你喜欢
  • 2012-07-16
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 2018-01-16
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多