Add a callback function to a Ruby array to do some

2020-05-24 17:00发布

I'd like to add something like a callback function to a Ruby array, so that when elements are added to that array, this function is called. One thing I can think of is to override all methods (like <<, =, insert, ...) and call that callback from there.

Is there an easier solution?

3条回答
一纸荒年 Trace。
2楼-- · 2020-05-24 17:49

Use the "Observer" pattern to be notified of changes in the size of the array you wish to observer: Ruby Observer This saves you from having to override all methods that add an element to the array

查看更多
一夜七次
3楼-- · 2020-05-24 17:50

The following code only invokes the size_changed hook when the array size has changed and it is passed the new size of the array:

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
查看更多
兄弟一词,经得起流年.
4楼-- · 2020-05-24 17:50

You should probably create your own class that wraps array. You don't want to override a core class with a callback like you are describing, not only does that make the code brittle but it becomes less expressive for future developers who may not be expecting Array to make a callback.

查看更多
登录 后发表回答