2015-01-07 12 views
5

Ich versuche, eine Scala-Implementierung eines Algorithmus für die Verwendung in JavaScript zu exportieren. Ich benutze @JSExport. Der Algorithmus arbeitet mit Scala Char und Werten, die als opak im markiert sind.Arbeiten mit undurchsichtigen Typen (Char und Long)

Ich würde gerne wissen (a) was das bedeutet; und (b) was die Empfehlung ist, damit umzugehen.

ich es vermute, bedeutet, dass ich Char und Long und arbeiten mit String sowie eine Laufzeitprüfung auf Länge (oder vielleicht ein unförmig Sized Sammlung verwenden) und Int stattdessen vermeiden sollten.

Aber andere Ideen willkommen.

Weitere Einzelheiten ...

Die Art von Code auf ich suche, ist:

@JSExport("Foo") 
class Foo(val x: Int) { 
    @JSExport("add") 
    def add(n: Int): Int = x+n 
} 

..., die wie erwartet funktioniert: new Foo(1).add(2) produziert 3.

Austausch der Arten mit Long den gleichen Anruf Berichte: java.lang.ClassCastException: 1 is not an instance of scala.scalajs.runtime.RuntimeLong (und etwas ähnliches mit Methoden, die nehmen und das Rück Char).

Antwort

8

opak zu sein, bedeutet, daß

  • keinen entsprechenden JavaScript-Typ ist
  • Es gibt keine Möglichkeit zu einen Wert dieses Typs von JavaScript erzeugen (außer wenn es einen @JSExport ed Konstruktor)
  • Es gibt keine Möglichkeit einen Wert dieses Typs zu manipulieren (außer Aufruf von @JSExport ed Methoden und Feldern)

Es ist immer noch möglich, einen Wert dieses Typs aus dem Code Scala.js zu erhalten, ihn herumzugeben und ihn an den Code Scala.js zurückzugeben. Es ist auch immer möglich, .toString() anzurufen, weil java.lang.Object.toString()@JSExport ed ist. Außer toString(), weder Char noch exportieren Sie alles, damit Sie nichts anderes mit ihnen tun können.

Daher kann ein JavaScript 1, wie Sie erfahren haben, nicht als Scala.js Long verwendet werden, weil es nicht vom richtigen Typ ist. Weder ist 'a' eine gültige Char (aber es ist eine gültige String).

Daher müssen Sie, wie Sie selbst herausgefunden haben, in der Tat undurchsichtige Typen vermeiden und stattdessen andere Typen verwenden, wenn Sie sie aus JavaScript erstellen/bearbeiten müssen. Die Scala.js-Seite kann mit den Standardwerkzeugen in der Sprache, z. B. someChar.toInt und someInt.toChar, hin und her konvertieren.

Die Wahl, welcher Typ am besten ist, hängt von Ihrer Anwendung ab. Für Char könnte es Int oder String sein.Für Long könnte es String, ein Paar Int s oder möglicherweise sogar Double sein, wenn die möglichen Werte nie mehr als 52 Bits Genauigkeit verwenden.

+0

Danke - das ist super klar. –

Verwandte Themen