如何在 Ruby 中将 class 标记为已弃用?
How to mark a class as Deprecated in Ruby?
在Ruby中(更是如此:Rails)是easy to mark methods as deprecated。
但是如何将整个 class 标记为已弃用?我想在使用 class 时发出警告:
class BillingMethod
end
BillingMethod.new #=> DEPRECATION WARNING: the class BillingMethod is deprecated. Use PaymentMethod instead.
或者在继承中使用时:
class Sofort < BillingMethod
end
Sofort.new #=> DEPRECATION WARNING: the class BillingMethod is deprecated. Use PaymentMethod instead.
或者,在嵌套 classes 中使用时:
class BillingMethod::Sofort < BillingMethod
end
BillingMethod::Sofort.new #=> DEPRECATION WARNING: the class BillingMethod is deprecated. Use PaymentMethod instead.
我认为 class_eval
-block 将是放置此类警告的地方。那是正确的地方吗?或者有更好的方法吗?
为什么不这样做:
def initialize(*args)
warn "DEPRECATION WARNING: ..."
super
end
您可以使用 const_missing
来弃用常量,并推而广之,classes。
const_missing
在引用未定义常量时被调用。
module MyModule
class PaymentMethod
# ...
end
def self.const_missing(const_name)
super unless const_name == :BillingMethod
warn "DEPRECATION WARNING: the class MyModule::BillingMethod is deprecated. Use MyModule::PaymentMethod instead."
PaymentMethod
end
end
这允许引用 MyModule::BillingMethod
的现有代码继续工作,并警告用户他们使用了已弃用的 class。
这是我迄今为止看到的最好的弃用 class 目的。
您可能想看看 Deprecate
,它是 Ruby 标准库的一部分:
require 'rubygems'
class BillingMethod
extend Gem::Deprecate
class << self
deprecate :new, "PaymentMethod.new", 2016, 4
end
# Will be removed April 2016, use `PaymentMethod.new` instead
def initialize
#...
end
end
使用 deprecated
方法会产生如下警告:
BillingMethod.new
# => NOTE: BillingMethod#new is deprecated; use PaymentMethod.new instead. It will be removed on or after 2016-04-01.
# => BillingMethod#new called from file_name.rb:32.
在Ruby中(更是如此:Rails)是easy to mark methods as deprecated。
但是如何将整个 class 标记为已弃用?我想在使用 class 时发出警告:
class BillingMethod
end
BillingMethod.new #=> DEPRECATION WARNING: the class BillingMethod is deprecated. Use PaymentMethod instead.
或者在继承中使用时:
class Sofort < BillingMethod
end
Sofort.new #=> DEPRECATION WARNING: the class BillingMethod is deprecated. Use PaymentMethod instead.
或者,在嵌套 classes 中使用时:
class BillingMethod::Sofort < BillingMethod
end
BillingMethod::Sofort.new #=> DEPRECATION WARNING: the class BillingMethod is deprecated. Use PaymentMethod instead.
我认为 class_eval
-block 将是放置此类警告的地方。那是正确的地方吗?或者有更好的方法吗?
为什么不这样做:
def initialize(*args)
warn "DEPRECATION WARNING: ..."
super
end
您可以使用 const_missing
来弃用常量,并推而广之,classes。
const_missing
在引用未定义常量时被调用。
module MyModule
class PaymentMethod
# ...
end
def self.const_missing(const_name)
super unless const_name == :BillingMethod
warn "DEPRECATION WARNING: the class MyModule::BillingMethod is deprecated. Use MyModule::PaymentMethod instead."
PaymentMethod
end
end
这允许引用 MyModule::BillingMethod
的现有代码继续工作,并警告用户他们使用了已弃用的 class。
这是我迄今为止看到的最好的弃用 class 目的。
您可能想看看 Deprecate
,它是 Ruby 标准库的一部分:
require 'rubygems'
class BillingMethod
extend Gem::Deprecate
class << self
deprecate :new, "PaymentMethod.new", 2016, 4
end
# Will be removed April 2016, use `PaymentMethod.new` instead
def initialize
#...
end
end
使用 deprecated
方法会产生如下警告:
BillingMethod.new
# => NOTE: BillingMethod#new is deprecated; use PaymentMethod.new instead. It will be removed on or after 2016-04-01.
# => BillingMethod#new called from file_name.rb:32.