Каков хороший шаблон фасада для создания идиоматических итераторов Ruby из Java-итераторов? - PullRequest
0 голосов
/ 31 января 2011

Я использую JRuby 1.6.0.RC1. Я хотел бы использовать java.util.Iterators в некоторых библиотеках Java более идиоматически из Ruby, предоставляя фасад, реализующий метод Ruby 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.

Может кто-нибудь либо подсказать, что я делаю неправильно, либо указать на лучший шаблон для вызова итераторов Java из Ruby?

Ответы [ 2 ]

2 голосов
/ 31 января 2011

JRuby имеет встроенную поддержку для превращения java.util.Iterator s в Ruby Enumerable s. Так что вы также можете просто сделать

myJavaObj.myIterator.each { ... }

в вашем коде.

1 голос
/ 31 января 2011

Я не уверен, но, возможно, вызов yield внутри блока while вызывает эту проблему.

Вы можете попробовать вызвать блок явно:

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