JRuby から Java データ構造にアクセスする際に、Java データ構造間に何らかの魔法の変換が行われているようです。これらは、プレーンなルビ マップおよび配列のように機能するように見えます。ただし、Scala データ構造はそうではありません。JRuby と Scala の相互運用性についてグーグルで調べてみると、驚くほどほとんど見つかりませんでした。Map
たとえば、Scalaと型をどのように反復処理しList
ますか?
2 に答える
できますよ。しかし、それは少しフープジャンプです。リストの場合:
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
これで、jruby にスカラ リストができました。暗黙のうちにいくつかの適切な Ruby API を作成することができます。
map
「繰り返し」とは、reduce
、filter
、などの HOF (高階関数) を使用することを意味する場合、collect
問題が発生します。それは可能ですが、Scala で得られる構文の優雅さは、関数リテラルを非常に簡単に記述できるためです。次のようなものを書いたときに、コンパイラが何をしているか:
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)
Function1[Int, Int]
... は、apply
メソッドが単一のInt
引数を取り、関数リテラル ( ) の本体を評価するサブクラスを作成してインスタンス化します(i => i * i)
。
関数を受け入れる Scala メソッドを使用するには、同じことを行う必要があります。何かのようなもの:
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)
全体として、Scala から Java ライブラリを使用する方が、他の JVM 言語から Scala コードを使用するよりもはるかに簡単です。そのため、Scala クライアントと Java クライアントの両方をサポートしたい Akka のようなシステムには、Scala 言語のこれらの部分を回避する特別な Java API があります。