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

时间:2010-04-21 10:02:39

标签: ruby scope

我想知道如何从类中定义方法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 ++的::以访问全局范围的东西,但我似乎找不到任何有关它的信息。我想我不知道具体是什么。

1 个答案:

答案 0 :(得分:16)

在顶级,defObject添加私有方法。

我可以想到三种获得顶级功能的方法:

(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的有效超类,第二个参数是要调用的方法,所有剩余的参数(如果有的话)作为参数传递给选择的方法。