scala.js中的js.Array和JVM上的Scala是否有通用接口?

时间:2017-07-31 21:42:51

标签: scala.js

理想情况下,通用接口或类型允许编译为JS和JVM的代码使用快速数组类型而无需使用缓冲区。据推测,Scala.js中最快的数组类型是js.Array(可调整大小),而在JVM上它是数组(不可调整大小),因此Array在这里不起作用。

可能是类型类是这里的方式,但这可能是矫枉过正。不过,如果这是最好的解决方案,我有兴趣知道。

想到另一个可能的解决方案,即需要相当多的协作,但需要相当多的努力才能使新的Scala Collections API就此目的达成一致意见(尽管它不会仅限于JS和JVM上使用的库。它可能最终成为JVM的Scala集合中现有Array实现的受限视图,假设这种方法不会产生性能损失。

1 个答案:

答案 0 :(得分:4)

正如@sjrd已经指出的那样,如果您只关心接口,那么所有正常的Scala集合接口都可以工作。

如果您担心效率,值得注意的是,在Scala.js中,我们将scala.Array支持js.Array(加上一些RTTI)。因此,如果您使用scm.ArrayBuilder,它将基本归结为一个简单的JS数组:

import scala.collection.mutable.ArrayBuilder

val builder = ArrayBuilder.make[Int]

builder += 1
builder += 2
builder += 3

println(builder.result())

优化后,会给你(Scala.js 0.6.19,Scala 2.11.11)

var elems$2 = null;
elems$2 = [];
elems$2.push(1);
elems$2.push(2);
elems$2.push(3);

// builder.result()
var x = $makeNativeArrayWrapper($d_I.getArrayOf(), elems$2);

// println(...)
var this$6 = $m_s_Console$();
var this$7 = $as_Ljava_io_PrintStream(this$6.outVar$2.v$1);
this$7.java$lang$JSConsoleBasedPrintStream$$printString__T__V((x + "\n"))