使用不透明类型(Char和Long)

时间:2015-01-07 14:38:48

标签: scala.js

我尝试导出用于JavaScript的算法的Scala实现。我正在使用@JSExport。该算法适用于interoperability guide中标记为 opaque 的Scala CharLong值。

我想知道(a)这意味着什么; (b)处理此问题的建议是什么。

我认为这意味着我应该避免CharLong并使用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的方法类似的东西。)

1 个答案:

答案 0 :(得分:9)

不透明意味着

  • 没有相应的JavaScript类型
  • 无法从JavaScript 创建该类型的值(除非有@JSExport ed构造函数)
  • 无法操纵该类型的值(除了调用@JSExport ed方法和字段外)

仍然可以从Scala.js代码接收该类型的值,传递它,并将其返回给Scala.js代码。也始终可以致电.toString(),因为java.lang.Object.toString()@JSExport。除toString()外,CharLong都不会导出任何内容,因此您无法对其进行任何操作。

因此,正如您所经历的那样,JavaScript 1不能用作Scala.js Long,因为它不是正确的类型。 'a'无效Char(但它是有效的String)。

因此,正如您自己推断的那样,您必须确实避免使用opaque类型,如果需要从JavaScript创建/操作它们,请使用其他类型。 Scala.js可以使用该语言中的标准工具来回转换,例如someChar.toIntsomeInt.toChar

选择哪种类型最好取决于您的应用。对于Char,可以是IntString。对于Long,如果可能的值从不使用超过52位的精度,则它可以是String,一对Int,甚至可能是Double