【问题标题】:Working with opaque types (Char and Long)使用不透明类型(Char 和 Long)
【发布时间】:2015-01-08 00:02:37
【问题描述】:

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

我想知道 (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 的方法类似的东西)。

【问题讨论】:

    标签: scala.js


    【解决方案1】:

    不透明意味着

    • 没有对应的 JavaScript 类型
    • 无法从 JavaScript创建该类型的值(除非有 @JSExported 构造函数)
    • 没有办法操作该类型的值(除了调用@JSExported 方法和字段)

    仍然可以从 Scala.js 代码中接收该类型的值,将其传递给 Scala.js 代码。也总是可以调用.toString(),因为java.lang.Object.toString()@JSExported。除了toString()CharLong 都不导出任何东西,所以你不能对它们做任何其他事情。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 2011-04-26
      • 2022-10-18
      相关资源
      最近更新 更多