Как расширить модуль Ruby в контексте класса? - PullRequest
1 голос
/ 09 мая 2011

У меня есть следующий скрипт Ruby, в котором класс Foo включает в себя модуль Baz, в модуле Baz есть включенный хук, чтобы сделать Bar расширенным включающим классом (Foo).Мне просто интересно, почему:

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 ]

1 голос
/ 09 мая 2011

Вам нужно вызвать метод extend для объекта класса (klass), а не для одноэлементного класса (class << klass). </p>

Следовательно, следующий код не работает, потому что вы вызываете метод extend в классе singleton:

  class << klass
    extend Bar # doesn't work because self refers to the the singleton class of klass
    def hello
      puts "hello"
    end
  end
1 голос
/ 09 мая 2011

В теле class << klass, self относится к классу синглтона klass, а не к klass, в то время как в klass.extend(Bar) получатель сам по себе 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, выполнение этого в теле class << klass не работает.

...