簡體   English   中英

添加一個回調函數到Ruby數組,以便在添加元素時執行某些操作

[英]Add a callback function to a Ruby array to do something when an element is added

我想在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這使您不必重寫向數組添加元素的所有方法

數組之間的區別

[英]Difference between array<<element and array.push(element)? or string<<“something” and string+“something”? in Ruby

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM