【问题标题】:Adding a method to the Array class via a proc/block?通过 proc/block 向 Array 类添加方法?
【发布时间】:2015-06-26 15:35:15
【问题描述】:

我正在尝试在 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?)

【问题讨论】:

  • 如果没有给出块,你可能希望keep返回一个枚举器,这样它就可以被链接起来。

标签: ruby arrays block proc


【解决方案1】:

您的测试没有通过,因为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 的任何元素)。

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 2022-11-27
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多