gpt4 book ai didi

ruby - 在 for 循环中使用 catch/throw 时出错 - 不匹配的 "end"?

转载 作者:太空宇宙 更新时间:2023-11-03 17:25:01 26 4
gpt4 key购买 nike

我正在阅读 "The Ruby Programming Language"并想尝试书中提供的示例(第 6 章,改变控制流,catch 和 throw)使用 catch/throw 跳出嵌套循环:

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

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

data => [[[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',但在之后得到错误输入上面的第四行)。

有谁知道我为什么会收到这个错误?

最佳答案

这似乎是构建和/或环境相关的(我倾向于环境):

  • 当我从 Sublime Text 2 中执行原始代码时它可以工作
  • 原始代码在命令行通过 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

关于ruby - 在 for 循环中使用 catch/throw 时出错 - 不匹配的 "end"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14593181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com