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
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.
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.
Grazie per la spiegazione del desugaring. – devth
Grazie per l'aggiornamento. Cercando questo. – devth