2014-11-20 73 views
0

在看着this video的时候,我遇到了一个有趣的问题,主持人Dave Thomas。他是在谈论我们看到Ruby类方法定义所有的时间语法:在'class << self'方法定义中访问Ruby'self'方法

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谈到了将语法插入到层次结构中的匿名超类。我试过如下:

  • 调用Foo.superclass.baz不起作用,因为Foo.superclass只是Object
  • 我对祖先层次结构的可用方法进行了探讨,但无济于事。
  • Test.class_eval 'self.self.baz' ......现在事情变得有些荒谬。

想法?

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

+0

在视频的最后,戴夫解释了几种方式来做到这一点,每一种方式都比上次更优雅。 – jreut 2014-11-20 23:03:19

回答

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

+0

您的'Class#meta'只是'Object#singleton_class'的重新实现。 – 2014-11-20 23:26:56

相关问题