使用catch / throw for循环时出错 - 无法匹配的“结束”?

时间:2013-01-29 22:24:13

标签: ruby syntax-error

我正在阅读"The Ruby Programming Language"并想尝试使用catch / throw打破嵌套循环的书中提供的示例(第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

我将数据定义为三个矩阵的数组:

  

数据    => [[[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,我没有机会进入最后'结束',但是得到错误之后进入上面的第四行)。

有谁知道我收到此错误的原因?

3 个答案:

答案 0 :(得分:3)

do您不需要for ... in ...。这实际上是一个语法错误。那是你的问题。与catch / throw无关。只需从所有do循环中删除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问题。当我将代码放在脚本中时,它可以很好地工作。

答案 1 :(得分: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

答案 2 :(得分:0)

正如我在评论中所说,从do语句中删除for