如何访问ruby中的(阴影)全局函数

前端之家收集整理的这篇文章主要介绍了如何访问ruby中的(阴影)全局函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道如何从一个类定义一个方法fn的 ruby中访问全局函数fn.我已经通过使这样的功能进行别名来解决了这个问题:
def fn
end

class Bar
    alias global_fn fn
    def fn
        # how to access the global fn here without the alias
        global_fn
    end
end

我正在寻找一些符合c’s ::的方式来访问全球范围,但我似乎找不到任何有关它的信息.我想我不知道我在找什么.

解决方法

在顶层,def为Object添加了一个私有方法.

我可以想到三种方式来获得顶级功能

(1)使用send调用对象本身的私有方法(仅当方法不是mutator时才起作用,因为Object将成为接收者)

Object.send(:fn)

(2)获取顶级方法的Method实例,并将其绑定到要在其上调用的实例:

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

(3)使用超级(假定没有超级类的Bar下面的Object重新定义函数)

class Bar
  def fn
    super
  end
end

更新:

因为解决方案(2)是最好的(在我看来),我们可以尝试通过在Object上定义一个实用方法来改进语法: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)
  end
end

使用如下:

class Bar
  def fn
    super_method Object,:fn
  end
end

其中super_method的第一个参数必须是Bar的有效超类,您要调用方法的第二个参数以及所有剩余的参数(如果有的话)作为参数传递给所选方法.

猜你在找的Ruby相关文章