From: nobu.nakada@... Date: 2000-04-28T13:36:35+09:00 Subject: [ruby-list:22182] Re: Can't Use optparse なかだです。 At Fri, 28 Apr 2000 12:18:07 +0900, Yamada Kenji wrote: > 少し時間ができたので,RDtool を使えるように > なろかと思いインストールしようとしたのですが, > optparse でつまずいてしまいました. すいません。m(__)m > :~/work/optparse-0.6.5% ruby getopts.test > ./optparse.rb:892:in `visit': return from proc-closure > (LocalJumpError) > from ./optparse.rb:873:in `reverse_each' > from ./optparse.rb:873:in `visit' > from ./optparse.rb:891:in `search' > from ./optparse.rb:705:in `switch' > from ./optparse.rb:656:in `each' > from ./optparse.rb:656:in `switch' > from ./optparse.rb:738:in `on' > from getopts.test:12 > from getopts.test:18:in `options' > from getopts.test:18 これって [ruby-dev:9435] break from &block で報告されたバグだと思う んですが、とりあえず添付のパッチでどうでしょうか。問題なければ入れて 0.6.6 にしますが。 > 1.4.4 でないとダメなのかと思いつつ Debian どっぷり > なのでパッケージがでるまでは 1.4.3 のままで行きたいと > 思っています.どなたか同じような現象がでている方は > いませんか? 0.6.4 だと return しているブロックをさらに渡してるところはないような ので、大丈夫だと思います。0.6.5 での変更はエラーリカバリだけなので、 RDtool を使う分にはどっちでも(というかもっと古いのでも)一緒です。 --- optparse.rb~ Tue Apr 25 07:50:43 2000 +++ optparse.rb Fri Apr 28 13:34:57 2000 @@ -888,10 +888,12 @@ * (({Block})): yielded with the found value when succeeded. =end #'#"#`# def search(id, k) - visit(:search, id, k) do |k| - return k unless iterator? - return yield(k) + k = catch(:found) do + visit(:search, id, k) {|k| throw :found, k} + return end + return k unless iterator? + yield(k) end module_function :search private :search @@ -906,8 +908,12 @@ def complete(opt) canon, sw = opt.downcase, nil search(:long, canon) {|sw| return sw, canon} # exact match or... - visit(:complete, Regexp.new('\A' + Regexp.quote(canon).gsub(/\w+/, '\&\w*'))) {|sw, canon| return sw, canon} - raise InvalidOption, opt + catch(:found) { + visit(:complete, Regexp.new('\A' + Regexp.quote(canon).gsub(/\w+/, '\&\w*'))) {|sw, canon| + throw :found, [sw, canon] + } + raise InvalidOption, opt + } end module_function :complete private :complete -- そうだ 強気に ちょっと インチキに☆彡 中田 "Bugるくらいがちょうどいいかも;-)" 伸悦