通过proc / block向Array类添加方法?

时间:2015-04-20 03:34:58

标签: ruby arrays block proc

我试图在Array类中添加额外的功能以获取块。我认为我大部分时间都是这样,但是,当调用方法使用.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?)

2 个答案:

答案 0 :(得分:4)

您的测试未通过,因为each返回调用它的枚举。要修复,请更改您的定义:

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的任何元素。)

答案 1 :(得分:2)

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

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