MST
星途 面试题库

面试题:Ruby 语法之块与迭代器的深入应用

编写一个 Ruby 方法 `process_collection`,它接受一个数组和一个块作为参数。方法需要遍历数组,对每个元素应用块中的逻辑。如果块返回 `true`,则将该元素收集到一个新数组中并返回。例如,`process_collection([1, 2, 3, 4, 5]) { |num| num.even? }` 应该返回 `[2, 4]`。同时,请解释块在 Ruby 中的工作原理以及与迭代器的关系。
27.4万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试
def process_collection(arr)
  result = []
  arr.each do |element|
    if yield(element)
      result << element
    end
  end
  result
end

块在 Ruby 中的工作原理

块(block)是 Ruby 中一种匿名的可执行代码段。它可以附加到方法调用上,作为额外的代码逻辑传递给方法。块没有自己独立的作用域,它会继承定义它的上下文的作用域。当方法执行到 yield 关键字时,会暂停方法的执行,转而执行块中的代码,并将 yield 后面的参数传递给块。块执行完毕后,控制权交回给方法,方法继续执行 yield 之后的代码。

块与迭代器的关系

迭代器(iterator)是 Ruby 中用于遍历集合(如数组、哈希等)的方法。许多迭代器方法,如 eachmapselect 等,都接受一个块作为参数。块为迭代器提供了针对集合中每个元素执行的具体操作逻辑。迭代器负责按顺序逐个取出集合中的元素,并将其传递给块,由块决定对该元素执行何种操作。通过这种方式,块与迭代器紧密协作,使集合操作变得简洁且灵活。例如 each 方法会遍历数组每个元素,每次都执行传递给它的块,map 方法会根据块的返回值构建一个新数组,select 方法会根据块返回值是否为 true 来筛选元素等。