I have a class:

class MyClass
  def self.say_hello
    puts "hello"
  end
end

and I want to create a process to override the class and its method temporarily:

begin "a temporary namespace, constants, variables and methods within this code"
  Thread.current[:neverland] = -> do
    Object.instance_exec do
      class MyClass
        def self.say_hi
          puts "hi"
        end
      end

      MyClass.say_hi
      MyClass.say_hello
    end
  end
end

> Thread.current[:neverland].call
=> "hi"
=> "hello"

> MyClass.methods - Object.methods
=> ["say_hello"]

> MyClass.say_hi
=> undefined method `say_hi' for MyClass:Class (NoMethodError)

Is there something like this in Ruby or am I just dreaming? Namespace pollution-free, temporary constants, methods, namespace, class. Clean, focused and optimized code, without too much distractions.

有帮助吗?

解决方案

You're probably thinking of something like Refinements that are scheduled for release in Ruby 2.0.

Until then you're going to have to be creative.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top