2011-01-31 34 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