我正在执行以下Ruby教程http://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/41-exceptions/lessons/93-throw-and-catch。其中一个练习要求我:
更改最后一个示例以从名为的方法返回找到的图块 搜索,而不是。搜索应该将平面图作为参数接收。
运动类似于上一个例子(运动前),看起来像:
candy = catch(:found) do
floor.each do |row|
row.each do |tile|
throw(:found, tile) if tile == "jawbreaker" || tile == "gummy"
end
end
end
puts candy
运动下面有一个提示:
尝试用方法定义替换'catch'行 'throw'行带'return'。
我这样做了:
candy = search do
floor.each do |row|
row.each do |tile|
return tile if tile == "jawbreaker" || tile == "gummy"
end
end
end
puts candy
但收到错误。任何人都可以告诉我如何做到积极的结果。还有一个问题:为什么在throw / catch代码中catch(:found)和不同throw(:found,tile)?
答案 0 :(得分:3)
更改最后一个示例,以从名为search的方法返回找到的tile。搜索应该将平面图作为参数接收。
据此我理解,练习是实现一个名为search的方法,它接收一个平面图作为参数。因此,您需要实现一个名为search 的方法:
def search(floor)
它应该将结果返回到candy,所以调用代码应如下所示:
candy = search(floor)
puts candy
现在,剩下的就是实现方法体,它应该返回结果。要使其返回正确的结果,row.each
应在谓词(tile == "jawbreaker" || tile == "gummy"
)为true
时立即停止。 each
这是不可能的,所以你应该用其他东西替换它。 find
返回与谓词匹配的第一个元素:
row.find { |tile| tile == "jawbreaker" || tile == "gummy" }
我会将外部循环所需的更改(floor.each
)作为练习留给OP。
答案 1 :(得分:1)
我的以下尝试通过了练习规范。
def search( floor)
floor.each do |row|
row.each do |tile|
return tile if tile == "jawbreaker" || tile == "gummy"
end
end
end
candy = ->(flr) {
search(flr)
}
puts candy
答案 2 :(得分:0)
我没有看到你提到的提示,但我猜他们希望你试试这个:
candy = floor.each do |row|
row.each do |tile|
return tile if tile == "jawbreaker" || tile == "gummy"
end
end
puts candy
让您收到LocalJumpError
。因为您无法在此使用return
。您可以使用break
,但它只会让您从内循环开始,这就是我们使用throw
- catch
从嵌套循环中跳出来的原因。
答案 3 :(得分:0)
floor = [["blank", "blank", "blank"],
["gummy", "blank", "blank"],
["blank", "blank", "blank"]]
def search(floor)
floor.each do |row|
row.each do |tile|
return tile if tile == "jawbreaker" || tile == "gummy"
end
end
end
candy = lambda {|floor| search(floor)}
puts candy.call(floor)