通过 proc/block 向数组 class 添加方法?

Adding a method to the Array class via a proc/block?

我正在尝试在数组 class 中添加额外的功能来接收一个块。我想我基本上已经明白了,但是,我不确定在调用方法时我想使用的语法使用 .to_proc / & 为预定义方法进行转换(例如 .odd? ).

我有以下代码:

class Array 

  def keep
    each do |user_array_element|
      user_array_element
      if yield(user_array_element) == true 
        kept_elements ||= []
        kept_elements << user_array_element
      end
    end
  end
end

正在尝试通过以下测试:

assert_equal [1, 3], [1, 2, 3].keep(&:odd?)

您的 keep 方法需要 return 包含保留元素的数组。我稍微修改了你的代码,这应该可以工作:

class Array 
  def keep
    kept_elements = []
    each do |user_array_element|
      if yield(user_array_element) == true 
        kept_elements << user_array_element
      end
    end
    kept_elements
  end
end

你的测试没有通过,因为 each returns 它被调用的可枚举。要修复,请像这样更改您的定义:

class Array 
  def keep
    [].tap do |kept_elements|
      self.each do |element|
        kept_elements << element if (yield(element) == true)
      end
    end # will return kept_elements
  end
end

另一种方法是使用 each_with_object:

class Array 
  def keep
    self.each_with_object([]) do |element, kept_elements|           
      kept_elements << element if (yield(element) == true)
    end # will return kept_elements
  end
end

上面的代码只是向您展示如何让您自己的代码工作。但本质上,您正在为 select 已经做的事情编写一个方法(除了它选择块不会产生 nilfalse 的任何元素)。