我仍然是Ruby的新手(阅读Pickaxe并花费大部分时间irb
),现在我知道可以在Ruby中修补类,我想知道什么时候可以接受这样做,特别是它是否可以接受修补Ruby的基类.例如:我在这里回答了另一个Ruby问题,海报想要知道如何减去小时数DateTime
.由于DateTime
该类似乎没有提供此功能,我发布了一个答案,可以将这些DateTime
和Fixnum
类补丁作为可能的解决方案.这是我提交的代码:
require 'date'
# A placeholder class for holding a set number of hours.
# Used so we can know when to change the behavior
# of DateTime#-() by recognizing when hours are explicitly passed in.
class Hours
attr_reader :value
def initialize(value)
@value = value
end
end
# Patch the #-() method to handle subtracting hours
# in addition to what it normally does
class DateTime
alias old_subtract …
Run Code Online (Sandbox Code Playgroud) Ruby 2.0中引入了所谓的改进.我和他们一起玩,现在我完全被哄骗了:
- 主要宣称的优势refine
是它们不是全球范围的.呸.
module MyModule
class ::String
def my_locally_needed_func
# do smth
end
end
end
# here I need it
require 'mymodule'
"".my_locally_needed_func
Run Code Online (Sandbox Code Playgroud)
孤立不是更糟.
- 优化不支持类方法.呸.当然他们是通过黑客攻击(记住,一切都是对象):
module VoidRefinements
refine String do
def self.singleton_method_for_string_class
puts "inside singleton_method_for_string_class"
end
end
end
module VoidRefinementsOK
refine Class do
def singleton_method_for_string_class
err_msg = "NoMethodError: undefined method ‘#{__method__}’ for ‘#{self}:#{self.class}’"
raise NoMethodError.new(err_msg) unless String == self
puts "inside proper singleton_method_for_string_class"
end
end
end
using VoidRefinements
String.singleton_method_for_string_class rescue puts $!
using VoidRefinementsOK …
Run Code Online (Sandbox Code Playgroud)