通过 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
已经做的事情编写一个方法(除了它选择块不会产生 nil
或 false
的任何元素)。
我正在尝试在数组 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
已经做的事情编写一个方法(除了它选择块不会产生 nil
或 false
的任何元素)。