我想知道如何从类中定义方法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 ++的::以访问全局范围的东西,但我似乎找不到任何有关它的信息。我想我不知道具体是什么。
答案 0 :(得分:16)
在顶级,def
向Object
添加私有方法。
我可以想到三种获得顶级功能的方法:
(1)使用send
来调用Object
本身的私有方法(仅当方法不是mutator时才有效,因为Object
将是接收者)
Object.send(:fn)
(2)获取顶级方法的Method
实例,并将其绑定到要在其上调用它的实例:
class Bar
def fn
Object.instance_method(:fn).bind(self).call
end
end
(3)使用super
(假设Bar
以下的Object
没有超级类重新定义该函数
class Bar
def fn
super
end
end
<强>更新强>
由于解决方案(2)是首选(在我看来),我们可以尝试通过在名为Object
的{{1}}上定义实用程序方法来改进语法:
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
的有效超类,第二个参数是要调用的方法,所有剩余的参数(如果有的话)作为参数传递给选择的方法。