添加一个回调函数到Ruby数组,以便在添加元素时执行某些操作

我想在Ruby数组中添加类似回调函数的东西,以便在将元素添加到该数组时调用此函数。 我能想到的一件事是覆盖所有方法(如<<,=,insert,…)并从那里调用该回调。

有更简单的解决方案吗?

以下代码仅在数组大小更改时调用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 

您应该创建自己的包装数组的类。 您不希望像您所描述的那样使用回调覆盖核心类,这不仅会使代码变得脆弱,而且对于可能不期望Array进行回调的未来开发人员来说也变得不那么具有表现力。

使用“Observer”模式通知您希望观察的数组大小的变化: Ruby Observer这使您不必重写向数组添加元素的所有方法