1

私は「Ruby プログラミング言語」を読んでいて、キャッチ/スローを使用してネストされたループから抜け出すために、本 (第 6 章、制御フローの変更、キャッチとスロー) で提供されている例を試してみたかった:

for matrix in data do 
  catch :missing_data do
    for row in matrix do 
      for value in row do
        throw :missing_data unless value
        puts value
      end
    end
  end
end

データを 3 つの行列の配列として定義しました。

データ => [[[2, 3, 7], [8, 9, 10], [0, 1, 4]], [["a", "b", "c"], ["d", false, "e"], ["f", "g", nil]], [["abc", "def"], ["ghi", "jkl"]]]

しかし、IRB (バージョン 1.9.3p327) でコードを試すと、「予期しない $end、keyword_end を予期しています」というエラーが発生します。私はコードをいじってみましたが、最も外側の (つまり for) ループを削除すると機能することがわかりましたが、ループでエラーが発生します。再確認するために、より単純なループを作成しました。

for i in [1,2,3] do
  catch :two do
    if i==2 then throw :two end
  end
end

繰り返しますが、同じ状況が発生します: for ループではエラー、for ループなしではエラーなし (実際、IRB を使用すると、最後の 'end' に入る機会がありませんが、4 番目に入った後にエラーが発生します)上の行)。

このエラーが発生する理由を知っている人はいますか?

4

3 に答える 3

3

で必要ありませdofor ... in ...。これは実際には構文エラーです。それはあなたの問題だ。catch/とは何の関係もありませんthrowdoすべてのforループからを削除するだけです。

実例:

for matrix in data 
  catch :missing_data do
    for row in matrix 
      for value in row
        throw :missing_data unless value
        puts value
      end
    end
  end
end

編集:

これはIRBの問題です。私があなたのコードをスクリプトに入れるとき、それは完全に機能します。

于 2013-01-29T22:37:21.487 に答える
3

これはビルドおよび/または環境に依存しているようです(私は環境に傾いています):

  • Sublime Text 2内から実行すると、元のコードが機能します
  • 元のコードはruby、コマンドラインから経由して実行すると機能します
  • に入力すると元のコードが機能しませirb

内側を外側にirbドロップするか、に使用すると、次のように機能します。dofor{}catch

$ rvm use 1.9.3-p327                                                                              Using /Users/Dave/.rvm/gems/ruby-1.9.3-p327
$ irb
irb(main):001:0> data = [[[2, 3, 7], [8, 9, 10], [0, 1, 4]], [["a", "b", "c"], ["d", false, "e"], ["f", "g", nil]], [["abc", "def"], ["ghi", "jkl"]]]
irb(main):002:0> for matrix in data do
irb(main):003:1*   catch(:missing_data) {
irb(main):004:2*     for row in matrix do 
irb(main):005:3*       for value in row do
irb(main):006:4*         throw :missing_data unless value
irb(main):007:4>         puts value
irb(main):008:4>       end
irb(main):009:3>     end
irb(main):010:2>   }
irb(main):011:1> end
2
3
7
8
9
10
0
1
4
a
b
c
d
abc
def
ghi
jkl
于 2013-01-29T22:37:43.037 に答える
0

コメントで言ったように、doあなたのfor声明から削除してください。

于 2013-01-29T22:49:55.913 に答える