弃用 Rails 中所有类方法的最佳方法

问题描述

我有一个具有多个类方法的类(它不是 ActiveRecord 模型)。必须弃用所有类方法。这样做的最佳方法是什么?

class MyClass
  class << self
    def method_to_deprecate_1
      ...
    end
    ...
    def method_to_deprecate_100
      ...
    end
  end
end

解决方法

Ruby 有一个特殊的模块 Gem::Deprecate,以下是官方文档中的示例:

class Legacy
  def self.klass_method
    # ...
  end

  def instance_method
    # ...
  end

  extend Gem::Deprecate
  deprecate :instance_method,"X.z",2011,4

  class << self
    extend Gem::Deprecate
    deprecate :klass_method,:none,4
  end
end

会导致:

2.5.0 :020 > Legacy.new.instance_method
NOTE: Legacy#instance_method is deprecated; use X.z instead. It will be removed on or after 2011-04-01.
Legacy#instance_method called from (irb):20.
 => nil 
2.5.0 :021 > Legacy.klass_method
NOTE: Legacy.klass_method is deprecated with no replacement. It will be removed on or after 2011-04-01.
Legacy.klass_method called from (irb):21.
 => nil

编辑: 为了直接回答您的问题,这是我能想到的最优雅的弃用所有类方法的方法:

class Kek
   class << self
     def old_method_1
       # ...
     end

     def old_method_2
       # ...
     end

     extend Gem::Deprecate

     # instance methods here are our actual class methods + all of the Object's methods from Ruby
     instance_methods(false).each { |method_to_deprecate| deprecate(method_to_deprecate,4) }
   end
end