2011-01-31 49 views
0

我在使用JRuby 1.6.0.RC1。我想通过提供一个实现Ruby each方法的外观,更加通俗地从Ruby使用某些Java库上的java.util.Iterators从Java迭代器创建惯用Ruby迭代器的好模式外观模式是什么?

我第一次尝试基本上是这样的:

def each_property(myJavaObj) 
    i = myJavaObj.myIterator 
    while i.hasNext 
    yield i.next 
    end 
end 

然而,当我打电话each_property {|p| puts "#{p}"}我得到的错误:LocalJumpError: yield called out of block

任何人都可以提示我做错了什么,或指出一个更好的模式从Ruby调用Java迭代器?

回答

2

JRuby中有把java.util.Iterator s转换红宝石Enumerable小号内置支持。所以你也可以简单地在你的代码中做

myJavaObj.myIterator.each { ... } 

1

我不确定,但可能在while块内调用yield会导致此问题。

您可以尝试显式调用块:

def each_property(myJavaObj, &block) 
    i = myJavaObj.myIterator 
    while i.hasNext 
    block.call i.next 
    end 
end 
+0

谢谢Koraktor,它让我的代码运行。虽然 – 2011-01-31 15:24:13