2011-01-31 3 views
0

JRuby 1.6.0.RC1を使用しています。 Ruby eachメソッドを実装するファサードを提供することによって、Rubyのより慣習的にいくつかのJavaライブラリでjava.util.Iteratorsを使用したいと思います。 LocalJumpError: yield called out of block:私はエラーを取得するeach_property {|p| puts "#{p}"}を呼び出すときに、しかしJavaイテレータから慣用的なRubyイテレータを作成するための良いパターンファサードパターンは何ですか?

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

私の最初の試みは、このように基本的でした。

誰でも私が間違っていることを示唆したり、RubyからJavaイテレータを呼び出すためのより良いパターンを指摘できますか?

答えて

2

のJRubyは、Ruby Enumerable秒にjava.util.Iterator秒を回すための組み込みサポートしています。単純にやりたいこともあるかもしれません。

myJavaObj.myIterator.each { ... } 

1

確かに分かりませんが、ブロックのブロック内にyieldを呼び出すと、この問題が発生する可能性があります。

あなたは明示的にブロックを呼び出してみてください可能性があります

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

ありがとうKoraktor、実行するコードを取得します。 –

+0

'&block'は、あなたのメソッドがブロックを期待し、' block'という名前の 'Proc'オブジェクトに"変換 "されることを明示します。 'while'ループの中では、パラメータ(' block(i.next) 'のようなもの)で呼び出されます。 – Koraktor

+0

申し訳ありませんが、わかりませんでした。私は&ブロックが何をするのか理解しています。私が確信していないのは、 'while'ブロックの文脈における元の' yield 'がうまくいかなかった理由です。私は何が間違っていたのかを理解して、今後同様のエラーを避けることができます! –

関連する問題