如何在类上下文中扩展Ruby模块?

时间:2011-05-09 01:57:13

标签: ruby module extend

我有以下Ruby脚本,其中类Foo包含模块Baz,模块Baz有一个包含钩子,可以通过包含类(Foo)扩展Bar。我只是想知道为什么:

class << klass
  extend Bar #this doesn't work. Why?
end

在以下情况下无效:

klass.extend(Bar) works.

这是我的代码:

#! /usr/bin/env ruby

module Baz
  def inst_method
    puts "dude"
  end 

  module Bar
    def cls_method
      puts "Yo"
    end
  end

  class << self
    def included klass
      # klass.extend(Bar) this works, but why the other approach below doesn't?
      class << klass
        extend Bar #this doesn't work. Why?
        def hello
          puts "hello"
        end
      end
    end
  end
end

class Foo
  include Baz
end

foo = Foo.new
foo.inst_method
Foo.hello
Foo.cls_method

2 个答案:

答案 0 :(得分:1)

class << klass的正文中,self指的是klass的单身类,而不是klass本身,而在klass.extend(Bar)中,接收者是{ {1}}本身。差异来自那里。

klass

由于您要将class A end class << A p self # => #<Class:A> # This is the singleton class of A, not A itself. end p A # => A # This is A itself. 应用于extend,因此在klass的正文中执行此操作无效。

答案 1 :(得分:1)

你想要的是调用类对象(klass)上的extend方法而不是单例类(类&lt;&lt; klass)。

因此,以下代码不起作用,因为您在单例类上调用extend方法:

  class << klass
    extend Bar # doesn't work because self refers to the the singleton class of klass
    def hello
      puts "hello"
    end
  end