访问'class<<中的Ruby'self'方法自我'方法定义

时间:2014-11-20 22:43:20

标签: ruby metaprogramming class-method

在观看this video时,我遇到了主持人Dave Thomas提出的一个有趣问题。他在谈论我们在Ruby类方法定义中一直看到的语法:

class Foo
  class << self
    def bar
      puts "inside class method"
    end
    def self.baz
      puts "inside anonymous superclass method"
    end
  end
end

当然,我们可以访问Foo.bar,但是如何进行baz? Dave Thomas谈到了将{匿名超类 - 插入层次结构中的class << self语法。我尝试了以下方法:

  • 致电Foo.superclass.baz并不起作用,因为Foo.superclass只是Object
  • 我探讨了祖先等级的可用方法无济于事。
  • Test.class_eval 'self.self.baz' ......现在事情变得有点荒谬了。

思想?

问题出现在视频中的44:23左右。

1 个答案:

答案 0 :(得分:0)

在视频结束时,我们会为这个问题提供几个答案。

首先,一件非常丑陋的事情。你可以重新开课:

class Foo
  class << self
    baz
  end
end

另一种方式。由于执行了类定义,因此可以将内部self返回到变量:

meta = class Foo
  class << self
    def self.baz
      puts "inside anonymous superclass method"
    end
    self # return self here
  end
end

meta.baz

或者,最优雅的是,您可以打开Class并为其添加方法:

class Class
  def meta
    class << self
      self
    end
  end
end

# class Foo ...

Foo.meta.baz

原来只是Object#singleton_class的重新实现。