2013-02-03 6 views
6

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

4

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.

+0

Danke für das Update. Probieren Sie es aus. – devth

3

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.

+0

Danke für die entschuldende Erklärung. – devth