No clear way to access Scala object instances from JRuby
--------------------------------------------------------

                 Key: JRUBY-6072
                 URL: https://jira.codehaus.org/browse/JRUBY-6072
             Project: JRuby
          Issue Type: Bug
          Components: Java Integration
    Affects Versions: JRuby 1.6.4
            Reporter: Arturas Slajus
            Priority: Minor


Scala has concept of objects - singleton classes which can be passed around:

{code}
object A {
  def str = "Scala string"
}

class B {
  def speak(obj: A.type) = println(obj.str)
}
{code}

This can be invoked using:
{noformat}
scala> arturas@arturaz-fujitsu:~/work/scala_jruby$ scala
Welcome to Scala version 2.9.1.final (Java HotSpot(TM) Server VM, Java 1.7.0).

scala> :load a.scala
Loading a.scala...
defined module A
defined class B

scala> val b = new B
b: B = B@1a299f9

scala> b.speak(A)
Scala string

{noformat}

When compiled to JVM bytecode it looks like:

{code:java}
// arturas@arturaz-fujitsu:~/work/scala_jruby$ javap A.class 
// Compiled from "a.scala"
public final class A {
  public static final java.lang.String str();
}

// arturas@arturaz-fujitsu:~/work/scala_jruby$ javap A\$.class 
// Compiled from "a.scala"
public final class A$ implements scala.ScalaObject {
  public static final A$ MODULE$;
  public static {};
  public java.lang.String str();
}

// arturas@arturaz-fujitsu:~/work/scala_jruby$ javap B.class 
// Compiled from "a.scala"
public class B implements scala.ScalaObject {
  public void speak(A$);
  public B();
}
{code}

These objects are used heavily in Scala stdlib. One of them are 
Java::scala.None.

The problem is that even if we can access methods on object A (like str()), we 
have no clear way of passing it around (like to class instance B, which 
actually expects class instance A$).

Also Ruby allows us to pass Java::A to B#speak, however it just fails with no 
method, because it actually tries to feed RubyClass to B#speak.

I'm not sure how we should solve this. 

One way would be a magic method __scala_object__ added to class X if we can see 
that there's X$ and it implements ScalaObject.

Other (perhaps better) way would be detecting if class X has class X$ that 
implements ScalaObject and just doing Java::X = Java::X$.new in jruby.

And we definately need to get it documented.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to