我想在Ruby数组中添加类似回调函数的东西,这样当元素添加到该数组时,就会调用此函数。 我能想到的一件事是覆盖所有方法(如<<,=,insert,...)并从那里调用该回调。
有更简单的解决方案吗?
答案 0 :(得分:6)
以下代码仅在数组大小发生更改时调用size_changed
挂钩并传递数组的新大小:
a = []
class << a
Array.instance_methods(false).each do |meth|
old = instance_method(meth)
define_method(meth) do |*args, &block|
old_size = size
old.bind(self).call(*args, &block)
size_changed(size) if old_size != size
end if meth != :size
end
end
def a.size_changed(a)
puts "size change to: #{a}"
end
a.push(:a) #=> size change to 1
a.push(:b) #=> size change to 2
a.length
a.sort!
a.delete(:a) #=> size change to 1
答案 1 :(得分:2)
您应该创建自己的包装数组的类。您不希望像您所描述的那样使用回调覆盖核心类,这不仅会使代码变得脆弱,而且对于可能不期望Array进行回调的未来开发人员来说也变得不那么具有表现力。
答案 2 :(得分:2)
使用“观察者”模式通知您希望观察的阵列大小的变化:Ruby Observer这使您不必重写向阵列添加元素的所有方法