【问题标题】:Access Ruby 'self' methods inside 'class << self' method definitions访问 'class << self' 方法定义中的 Ruby 'self' 方法
【发布时间】:2014-11-20 22:43:20
【问题描述】:

在观看this video 时,我遇到了主持人戴夫·托马斯提出的一个有趣的问题。他说的是我们一直在 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 &lt;&lt; self 语法。我尝试了以下方法:

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

想法?

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

【问题讨论】:

  • 在视频的最后,Dave 解释了几种方法,每一种都比上一种更优雅。

标签: ruby metaprogramming class-method


【解决方案1】:

在视频的结尾,我们得到了这个问题的几个答案。

首先,一些非常丑陋的东西。您可以重新开课:

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的重新实现。

【讨论】:

  • 您的Class#meta 只是Object#singleton_class 的重新实现。
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 2017-08-20
  • 2019-01-14
  • 2022-06-17
相关资源
最近更新 更多