gpt4 book ai didi

arrays - 合并数组时继承自定义方法

转载 作者:太空宇宙 更新时间:2023-11-03 18:03:03 25 4
gpt4 key购买 nike

我在数组实例上定义了一些自定义方法,例如:

a = [1, 2]
b = [3, 4]

a.define_singleton_method(:foo) do
"foo"
end

a.foo
# => "foo"

a 数组被添加到另一个数组(或任何其他数组操作,如 uniq、交集。 ..) 例如:

(a + b).foo
# undefined method `foo' for [1, 2, 3, 4]:Array (NoMethodError)

这是有道理的,因为创建了一个新数组。但是我想知道是否有一种方法可以在新创建的数组上保留 a 数组上的自定义方法。当然,我可以通过调用 define_singleton_method 的同一步骤传递每个数组,但这会随着时间的推移变得非常复杂,您很容易忘记一个数组。

最佳答案

可以编写 ArrayViralArray 子类,它会覆盖每个 Array 方法以生成一个新的 Array包括您的额外方法。

class ViralArray < Array
[:+, :*, :-].each { |method|
define_method(method) do |*args|
new_array = super(*args)
new_array.define_singleton_method(:foo) do
"foo"
end
new_array
end
}
end

my = ViralArray[1,2,3]
b = my + [4,5,6]
p b.foo # "foo"
p b.class # Array

这显然很乏味并且容易损坏。

但是像这样的病毒式方法使得代码非常难以理解。您永远不会知道哪些数组有 #foo,哪些没有。

相反,refine Array .改进就像猴子修补,但范围有限。

定义 Array 的细化,添加 #foo

module FooArray
refine Array do
def foo
"foo: #{object_id}"
end
end
end

并在需要使用 foo 方法的数组的代码中使用它。

using FooArray

a = [1,2,3]
puts a.foo

所有其他代码将不受影响。

关于arrays - 合并数组时继承自定义方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57640259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com