我正在阅读"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,我没有机会进入最后'结束',但是得到错误之后进入上面的第四行)。
有谁知道我收到此错误的原因?
答案 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)
这似乎与构建和/或环境有关(我倾向于环境):
ruby
运行时,原始代码有效
irb
在irb
内放do
在for
外部,或{}
使用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
。