How to access a (shadowed) global function in ruby How to access a (shadowed) global function in ruby ruby ruby

How to access a (shadowed) global function in ruby


At the top-level a def adds a private method to Object.

I can think of three ways to get the top-level function:

(1) Use send to invoke the private method on Object itself (only works if the method is not a mutator since Object will be the receiver)

Object.send(:fn)

(2) Get a Method instance of the top-level method and bind it to the instance you want to invoke it on:

class Bar  def fn    Object.instance_method(:fn).bind(self).call  endend

(3) Use super (assumes no super classes of Bar below Object redefine the function)

class Bar  def fn    super  endend

UPDATE:

Since solution (2) is the preferable one (in my opinion) we can try to improve the syntax by defining a utility method on Object called super_method:

class Object  def super_method(base, meth, *args, &block)    if !self.kind_of?(base)       raise ArgumentError, "#{base} is not a superclass of #{self}"     end    base.instance_method(meth).bind(self).call(*args, &block)  endend

Use like the following:

class Bar  def fn    super_method Object, :fn  endend

Where the first argument to super_method must be a valid superclass of Bar, the second argument the method you want to invoke, and all remaining arguments (if any) are passed along as parameters to the selected method.