我试图了解 grep 在此示例中的工作原理。该代码有效,但我不能 100% 确定事件发生的顺序,或者我是否正确理解何时何地返回的内容。
cars = [:Ford, :Toyota, :Audi, :Honda]
ucased_cars = cars.collect do |c|
c.to_s
end
.grep(/^Ford/) do |car|
puts car.upcase
car.upcase
end
puts "ucased:" + ucased_cars.to_s
我认为正在发生的是:
- 我定义了一个符号数组
- 我用一个块调用 collect 方法,该块导致汽车数组的每个符号元素 c 被转换为块内的字符串。
- collect 返回一个字符串数组
- grep 在 collect 返回的字符串数组上调用,并且 grep 在每个数组元素 car 上调用自己的块,匹配搜索模式,导致元素被打印、大写并作为数组的一部分返回。
- grep 返回一个大写字符串数组,将其分配给“ucased_cars”
- 数组 ucased_cars 在打印之前必须转换为字符串。
就第 4 步而言,以下哪项最能描述 grep 的工作原理:
[A] grep 查找与模式匹配的所有字符串。grep 在这个匹配数组上调用块。grep 将块的结果返回给调用函数。
[B] grep 查找与模式匹配的第一个字符串。grep 调用此匹配的块。这个块的返回值暂时堆积在某个地方。grep 搜索数组的下一个元素。如果匹配,则 grep 调用此匹配的块。grep 将此块的返回值添加到返回值的临时“存储”中。grep 查看下一个数组元素,直到找不到更多匹配项。然后 grep 将堆积的返回值传递回调用函数。
我的结论:
[A] 似乎更有意义。
[B] 似乎有很多不必要的捏造,似乎没有效率或不太可能。