问题描述
我有一个具有多个类方法的类(它不是 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