理想情况下,通用接口或类型允许编译为JS和JVM的代码使用快速数组类型而无需使用缓冲区。据推测,Scala.js中最快的数组类型是js.Array(可调整大小),而在JVM上它是数组(不可调整大小),因此Array在这里不起作用。
可能是类型类是这里的方式,但这可能是矫枉过正。不过,如果这是最好的解决方案,我有兴趣知道。
想到另一个可能的解决方案,即需要相当多的协作,但需要相当多的努力才能使新的Scala Collections API就此目的达成一致意见(尽管它不会仅限于JS和JVM上使用的库。它可能最终成为JVM的Scala集合中现有Array实现的受限视图,假设这种方法不会产生性能损失。
答案 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"))