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
- 1. Strutture dati persistenti in Scala
- 2. Strutture dati in Python
- 3. Accesso fortemente criptato a csv in scala?
- 4. Strutture dati ricorsive in Rust
- 5. Strutture dati persistenti in Java
- 6. parsing di strutture ricorsive in scala
- 7. Strutture di accesso e accesso che utilizzano l'obiettivo-
- 8. Strutture dati funzionali in Java
- 9. Strutture dati personalizzate in Python
- 10. Algoritmi e strutture dati
- 11. C: allineamento strutture dati
- 12. Strutture dati Trie - Java
- 13. Accesso a file FTP da Scala
- 14. Java Array in Jruby
- 15. Strutture dati autoreferenziali in Lisp/Scheme
- 16. Strutture dati utilizzate per creare file system?
- 17. Librerie per strutture dati rigide in Haskell
- 18. Accesso pubblico predefinito in scala
- 19. Campo di accesso nelle strutture nidificate
- 20. come posso convertire le strutture di dati ruby in strutture di dati javascript con .js.erb?
- 21. Strutture dati importanti nella ricerca
- 22. unire due strutture dati complesse
- 23. Valutazioni pigre delle strutture dati
- 24. Strutture dati complesse in Haskell - come funzionano?
- 25. Libreria di strutture dati standard in C?
- 26. Java: strutture dati con versione?
- 27. Libreria di strutture dati C
- 28. java: librerie per immutabili strutture di dati funzionali in stile
- 29. Diverse strutture dati e complessità
- 30. Generazione immutabili strutture dati ciclici
Grazie per l'aggiornamento. Cercando questo. – devth