我正在尝试导出算法的 Scala 实现以在 JavaScript 中使用。我在用着@JSExport
。该算法适用于 ScalaChar
and Long
值被标记为opaque in the 互操作性指南 http://www.scala-js.org/doc/js-interoperability.html#type-correspondance.
我想知道 (a) 这意味着什么; (b) 处理此问题的建议是什么。
我认为这意味着我应该避免Char
and Long
并与String
加上对长度的运行时检查(或者可能使用无形的Sized
集合)和Int
反而。
但欢迎其他想法。
更多详情...
我正在查看的代码类型是:
@JSExport("Foo")
class Foo(val x: Int) {
@JSExport("add")
def add(n: Int): Int = x+n
}
...其工作原理与预期一致:new Foo(1).add(2)
产生3
.
将类型替换为Long
相同的调用报告:java.lang.ClassCastException: 1 is not an instance of scala.scalajs.runtime.RuntimeLong
(以及与接受和返回的方法类似的东西Char
).
不透明意味着
- 没有对应的 JavaScript 类型
- 没有办法create来自 JavaScript 的该类型的值(除非有
@JSExport
ed 构造函数)
- 没有办法操纵该类型的值(除了调用
@JSExport
ed 方法和字段)
仍然可以从 Scala.js 代码接收该类型的值,将其传递,然后将其返回给 Scala.js 代码。也可以随时致电.toString()
, 因为java.lang.Object.toString()
is @JSExport
编辑。除了toString()
, 两者都不Char
nor Long
导出任何东西,所以你不能用它们做任何其他事情。
因此,正如您所经历的,JavaScript1
不能用作 Scala.jsLong
,因为它的类型不正确。既不是'a'
一个有效的Char
(但这是一个有效的String
).
因此,正如您自己推断的那样,如果您需要从 JavaScript 创建/操作它们,您确实必须避免不透明类型,并使用其他类型。 Scala.js 端可以使用该语言中的标准工具来来回转换,例如someChar.toInt
and someInt.toChar
.
选择哪种类型最好取决于您的应用。为了Char
, 它可能是Int
or String
. For Long
, 它可能是String
, 一对Int
s,或者甚至可能Double
如果可能的值从不使用超过 52 位的精度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)