我想知道如何从一个类定义一个方法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的有效超类,您要调用的方法的第二个参数以及所有剩余的参数(如果有的话)作为参数传递给所选方法.