如何考虑投掷和捕获的替代方案?

时间:2014-11-28 15:43:45

标签: ruby

我正在执行以下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)?

4 个答案:

答案 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)

好的,所以我做了这个,它对我有用。如果你已经在ruby中达到了这个目的,代码就是非常自我解释

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)