3

我想看看这段Java 代码在 JRuby 中的样子:

 ParseQuery query = new ParseQuery("MyClass");
 query.getInBackground(myId, new GetCallback() {
   public void done(ParseObject object, ParseException e) {
     if (e == null) {
       objectWasRetrievedSuccessfully(object);
     } else {
       objectRetrievalFailed();
     }
   }
 });

对我来说最大的困惑是匿名内部类。这是我最好的第一个猜测:

query = ParseQuery.new("GameScore")
query.getInBackground("xWMyZ4YEGZ", Class.new(GetCallback) do
  def done(object, e)
    #  ...
  end 
end.new)

更新:基于此编辑:http ://www.ruby-forum.com/topic/188599#823271

4

1 回答 1

1

在 JRuby 中表达这一点的语法看似简单。JRuby 有一个称为“闭包转换”的功能,其中传递给方法的闭包可以转换为适当的 Java 接口。来自JRuby 文档

这不仅适用于事件侦听器或 Runnable,而且基本上适用于任何接口。当调用一个需要接口的方法时,JRuby 会检查是否传递了一个块,并自动将该块转换为实现该接口的对象。

因此,您的代码如下所示:

query.in_background 'xWMyZ4YEGZ' { |object, e|
  # do stuff
}

JRuby wiki 上的“从 JRuby 调用 Java”页面是解决此类问题的好资源。

于 2012-08-18T20:50:20.007 回答