On Wed, Oct 14, 2009 at 11:51, Axel E. [email protected] wrote:
I really need some advice from somebody who has worked with JRuby here,
I guess. I just cannot find a way of writing a Java Matrix without curly
braces, yet the Ruby part of JRuby interprets curly braces as Hashes.
I think most of the people on this list have worked with JRuby.
Here’s the thing. If you’re programming in JRuby, you’re still
programming
in Ruby. So you need to use Ruby syntax, not Java syntax. Even though
JRuby
works on top of the JVM, it’s still an implementation of the Ruby
language,
and you need to use Ruby notation.
That means: curly braces are for Hashes, square brackets are for Arrays.
array = [1, 2, 3, 4]
Now for a two-dimensional array (or matrix) you still need to use the
Ruby
syntax:
matrix = [ [ 1.1, 1.2, 1.3, 1.4 ], [ 2.1, 2.2, 2.3, 2.4 ], [ 3.1, 3.2,
3.3,
3.4 ] ]
Now, this will give you a Ruby Array, not a Java Array so you have to do
some manipulation to convert this into a Java Array. Since Ruby is
dynamically-typed, you need to tell JRuby what Java type to convert this
Array to, so you need to do is use the to_java(class) method:
matrix = [ [ 1.1, 1.2, 1.3, 1.4 ], [ 2.1, 2.2, 2.3, 2.4 ], [ 3.1, 3.2,
3.3,
3.4 ] ].to_java
The problem with this is that you’lll get an Array of Object and not an
Array of Arrays of doubles. You need to convert each internal Array
separately to an Array of doubles:
matrix = [ [ 1.1, 1.2, 1.3, 1.4 ].to_java(Java::double), [ 2.1, 2.2,
2.3,
2.4 ].to_java(Java::double), [ 3.1, 3.2, 3.3, 3.4
].to_java(Java::double) ].to_java
While that takes care of the internal arrays, the result of this
expression
is STILL an Array of Objects, not an Array of Arrays.
Which brings us to the question (which one of the JRuby gurus will
hopefully
answer), how do we specify an Array as a parameter in to_java?
BTW, the case of String is special. JRuby does some internal magic to
convert Ruby Strings to Java Strings, but that’s just JRuby doing its
thing.
There is no such similar thing for Arrays which is why you need to jump
through the to_java hoops to convert between them.
Hope this helps,
-Mario.