2013-02-03 10 views
6

Sembra che ci sia una traduzione magica tra le strutture dati Java quando si accede a loro da JRuby; sembrano funzionare come semplici mappe e array di rubini. Tuttavia, le strutture dati di Scala non lo fanno. Ho trovato sorprendentemente piccolo quando ho cercato su google per JROPy/Scala. Come, ad esempio, dovresti iterare sui tipi di Scala Map e List?Accesso a strutture dati Scala in JRuby

risposta

4

Certo che puoi. Ma è un po 'di salto a ostacoli. Per gli elenchi:

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 

Ora avete una lista scala in jruby. Potresti scrivere delle belle API di Ruby che riempiono gli impliciti per te.

+0

Grazie per l'aggiornamento. Cercando questo. – devth

3

Se per "iterare su" intendi utilizzare i Hofs (funzioni di ordine superiore) quali map, reduce, filter, collect e così via, allora si sta andando ad avere problemi. È possibile, ma l'eleganza sintattica che ottieni in Scala viene perché è così facile scrivere letterali di funzione. Quello che il compilatore sta facendo per voi quando si scrive qualcosa di simile:

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) 

... è creare e un'istanza di una sottoclasse di Function1[Int, Int] cui apply metodo prende il singolo Int argomento una valuta il corpo della funzione letterale ((i => i * i)).

Per utilizzare qualsiasi metodo Scala che accetta una funzione, dovrai fare lo stesso. Qualcosa di simile:

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) 

In generale, è di gran lunga più facile da usare librerie Java da Scala che è di usare il codice Scala da qualsiasi altro linguaggio JVM. Ecco perché sistemi come Akka che vogliono supportare sia i client Scala che quelli Java hanno speciali API Java che evitano queste parti del linguaggio Scala.

+0

Grazie per la spiegazione del desugaring. – devth