相关疑难解决方法(0)

修补Ruby的基类是否可以接受,例如Fixnum?

我仍然是Ruby的新手(阅读Pickaxe并花费大部分时间irb),现在我知道可以在Ruby中修补类,我想知道什么时候可以接受这样做,特别是它是否可以接受修补Ruby的基类.例如:我在这里回答了另一个Ruby问题,海报想要知道如何减去小时数DateTime.由于DateTime该类似乎没有提供此功能,我发布了一个答案,可以将这些DateTimeFixnum类补丁作为可能的解决方案.这是我提交的代码:

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 monkeypatching

17
推荐指数
3
解决办法
2427
查看次数

Ruby 2.0中的改进完全没用吗?

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)

ruby ruby-2.0 refinements

-2
推荐指数
1
解决办法
2749
查看次数

标签 统计

ruby ×2

monkeypatching ×1

refinements ×1

ruby-2.0 ×1