轉名自我覆蓋:alias_method


#1

原始內文來自於這邊,just demo,首先,簡單的

class Person
  def all
    %w{ Bob Steve } # %w 為 string array 的簡寫
  end

  alias_method :old_all, :all

  def all
    old = self.old_all
    old << "Peter"
    old << "Owen"
  end
end

Person.new.old_all #=> ["Bob", "Steve"]
Person.new.all #=> ["Bob", "Steve", "Peter", "Owen"]

整個就類似 lambda 或 JavaScript 的 function 解 … 把 method name 也當作變數使用,而進階的

class Person
  def self.all
    %w{ Bob Steve }
  end
  # 作用域寫法,此為 class level,所以 method 定義為 class method
  class << self
    alias_method :old_all, :all
    def all
      old = self.old_all
      old << "Peter"
      old << "Owen"
    end
  end
end
Person.old_all #=> ["Bob", "Steve"]
Person.all #=> ["Bob", "Steve", "Peter", "Owen"]

上下其實一樣就是了,這樣就可以繼續蓋code為卍解 :slight_smile: