Es scheint, als gäbe es eine magische Übersetzung zwischen Java-Datenstrukturen beim Zugriff von JRuby aus; sie scheinen wie reine Ruby-Maps und -Arrays zu funktionieren. Scala-Datenstrukturen jedoch nicht. Ich fand überraschend wenig, wenn ich für JRuby/Scala Interop googlen. Wie würden Sie zum Beispiel über Scalas Map
und List
Typen iterieren?Zugriff auf Scala-Datenstrukturen in JRuby
Antwort
Sicher kannst du. Aber es ist ein bisschen Hoop-Springen. Für Listen:
require "/usr/share/scala/lib/scala-library.jar" # load the scala lib
Java::scala.collection.immutable::List.empty.send("::", 1)
.map(lambda{|e|e+1},
Java::scala.collection.immutable.List.canBuildFrom) # by lopex
Jetzt haben Sie eine Scala-Liste in Jruby. Sie könnten eine nette Ruby API schreiben, die die implicits für Sie ausfüllt.
Wenn von „iterieren“ Sie Hofs verwenden bedeuten (Funktionen höherer Ordnung) wie map
, reduce
, filter
, collect
und so weiter dann Ärger Sie gehen zu haben. Es ist möglich, aber die syntaktische Eleganz, die Sie in Scala bekommen, kommt daher, dass es so einfach ist, Funktionsliterale zu schreiben. Was der Compiler für Sie tun, wenn Sie so etwas schreiben:
scala> val l1 = List(1, 2, 3)
l1: List[Int] = List(1, 2, 3)
scala> l1.map(i => i * i)
res0: List[Int] = List(1, 4, 9)
... ist erstellen und eine Unterklasse von Function1[Int, Int]
deren apply
Methode nimmt die einzelnen Int
Argument ein wertet den Körper des Funktionsliteral instanziiert ((i => i * i)
).
Damit Sie eine Scala-Methode verwenden können, die eine Funktion akzeptiert, müssen Sie dasselbe tun. Etwas wie:
scala> class ISquaredF extends Function1[Int, Int] { def apply(i: Int) = i * i }
defined class ISquaredF
scala> (new ISquaredF)(5)
res1: Int = 25
scala> val isf1 = new ISquaredF
isf1: ISquaredF = <function1>
scala> l1.map(isf1)
res2: List[Int] = List(1, 4, 9)
Insgesamt ist es erheblich einfacher, Java-Bibliotheken von Scala zu verwenden, als es Scala Code von einer anderen JVM Sprache zu verwenden ist. Aus diesem Grund haben Systeme wie Akka, die sowohl Scala- als auch Java-Clients unterstützen, spezielle Java-APIs, die diese Teile der Scala-Sprache vermeiden.
Danke für die entschuldende Erklärung. – devth
Danke für das Update. Probieren Sie es aus. – devth