Ruby 如何考虑和选择X27;抛接球';?
我正在做下面的Ruby教程。其中一个练习要求我: 更改最后一个示例以从名为 而是搜索。搜索应将楼层平面作为参数接收 练习与上一个示例(练习前)类似,如下所示:Ruby 如何考虑和选择X27;抛接球';?,ruby,Ruby,我正在做下面的Ruby教程。其中一个练习要求我: 更改最后一个示例以从名为 而是搜索。搜索应将楼层平面作为参数接收 练习与上一个示例(练习前)类似,如下所示: candy = catch(:found) do floor.each do |row| row.each do |tile| throw(:found, tile) if tile == "jawbreaker" || tile == "gummy" end end end puts ca
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
下面是一个提示:
尝试用方法定义和
带“返回”的“抛出”行
我这样做了:
candy = search do
floor.each do |row|
row.each do |tile|
return tile if tile == "jawbreaker" || tile == "gummy"
end
end
end
puts candy
但是收到了错误。谁能告诉我怎样才能得到积极的结果。另外一个问题:为什么在抛出/捕获代码中有catch(:found)和不同的抛出(:found,tile) 我看不出你提到的暗示,但我想他们希望你试试这个:
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
从嵌套循环中跳出
将上一个示例更改为从名为search的方法返回找到的磁贴。搜索应将楼层平面作为参数接收
从这一点我了解到,这个练习是实现一个名为search的方法,它接收一个楼层平面作为参数。因此,您需要实现一个名为search的方法:
它应该将结果返回给candy,因此调用代码应该如下所示:
candy = search(floor)
puts candy
现在,剩下的就是实现方法体,它将返回结果。为了返回正确的结果,行。每个
都应该在谓词(tile==“jawbreaker”| | tile==“gummy”
)为true时立即停止。你可以用别的东西代替它find
返回与谓词匹配的第一个元素:
row.find { |tile| tile == "jawbreaker" || tile == "gummy" }
我将把所需的更改保留到外部循环(楼层。每个
)作为OP的练习。我的以下尝试通过了练习规范
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
好吧,我这么做了,这对我很有效。如果您已经在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)
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)