我试图在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?)
答案 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
已经执行的操作编写方法(除了它选择块不会产生nil
或false
的任何元素。)
答案 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