从Java迭代器创建惯用的Ruby迭代器有什么好的模式外观模式?

时间:2011-01-31 15:04:05

标签: ruby jruby

我正在使用JRuby 1.6.0.RC1。我希望通过提供实现Ruby java.util.Iterators方法的Facade,在Ruby中更加惯用一些Java库上的each

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

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 个答案:

答案 0 :(得分:2)

JRuby内置支持将java.util.Iterator转换为Ruby Enumerable。所以你可能也想做一下

myJavaObj.myIterator.each { ... }

代码。

答案 1 :(得分:1)

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

您可以尝试明确调用该块:

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