2014-11-20 74 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

相關問題