首页 > 解决方案 > 使用完全优化时,如何访问 Scala.js 中返回的元组的字段?

问题描述

Scala 函数的签名是。

斯卡拉:

@JSExportTopLevel("makeUciMovesScala")
  def makeUciMovesScala(
    variantKeyOptJs: js.UndefOr[String],
    fenOptJs: js.UndefOr[String],
    ucisJs: js.UndefOr[js.Array[String]]
  ):(
    js.UndefOr[String],
    js.Array[String],
    js.Array[String]
   )

当我查看结果时,如果没有优化,我会得到一个字典T3__f__1,其中包含元组元素的合理名称(like 代表元组 3,第一个元素)。

但是,通过优化,我优化了随机元组元素名称,例如N1, lj, mj

目前,我使用这个 hack 可以处理未优化和优化的代码。

javascript:

let fen = result.T3__f__1 || result.Nl
let legalMovesUcis = result.T3__f__2 || result.lj
let sanMoves = result.T3__f__3 || result.mj

但是,我担心这些随机名称并不稳定,并且会在代码更改时发生变化。

那么如何安全地解码从 Scala.js 返回的元组呢?

标签: javascriptreturntuplesscala.js

解决方案


您无法在 JavaScript 代码中解码从 Scala.js 返回的 Scala 元组。相反,您可以js.Tuple3从 Scala.js 返回 a,JavaScript 将能够自然地使用它:

@JSExportTopLevel("makeUciMovesScala")
def makeUciMovesScala(
  variantKeyOptJs: js.UndefOr[String],
  fenOptJs: js.UndefOr[String],
  ucisJs: js.UndefOr[js.Array[String]]
): js.Tuple3[js.UndefOr[String], js.Array[String], js.Array[String]] = ...
let fen = result[0];
let legalMovesUcis = result[1];
let sanMoves = result[2];

或者,如果您可以在 JavaScript 中使用数组解构:

let [fen, legalMovesUcis, sanMoves] = result;

以上通常适用于所有 Scala 类,除了一些原始数据类型。你总是需要给 JavaScript 一些它可以理解的东西。它可以是 JavaScript 类型,如上所述,或者提供@JSExported 成员的 Scala 类的实例。


推荐阅读