【发布时间】:2010-04-21 10:02:39
【问题描述】:
我想知道如何从一个还定义了方法fn 的类访问ruby 中的全局函数fn。我通过像这样对函数进行别名来解决问题:
我正在寻找与 c++ 的 :: 类似的东西来访问全局范围,但我似乎无法找到有关它的任何信息。我想我不知道具体我在寻找什么。
【问题讨论】:
我想知道如何从一个还定义了方法fn 的类访问ruby 中的全局函数fn。我通过像这样对函数进行别名来解决问题:
我正在寻找与 c++ 的 :: 类似的东西来访问全局范围,但我似乎无法找到有关它的任何信息。我想我不知道具体我在寻找什么。
【问题讨论】:
在顶层,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 上定义一个名为 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 的有效超类,第二个参数是您要调用的方法,所有剩余参数(如果有)作为参数传递给所选方法。
【讨论】:
Object 上的一个方法,希望可以为您改进语法
super_method 方法是一个很好的方法;)