Что такое текущий класс Ruby? - PullRequest
0 голосов
/ 31 марта 2019

В Ruby с метапрограммированием он сказал нам, что в Ruby существует не только self, но и текущий класс.

Мой вопрос: как узнать, какой сейчас текущий класс?если мы определим метод, где определение находится?Меня смущает разница между этими двумя кодами.Результат выполнения не совпадает.

Это указывает на то, что, возможно, когда мы хотим определить метод, мы используем class, чтобы открыть класс, а затем определить self.method, это не то же самое, что использование класса<< self чтобы открыть класс, а затем определить методы.На самом деле, это не будет использоваться в практической работе, но я просто хочу знать.

class C
  def self.m1
    puts "when in m1, self is #{self}"
    def m2; end
  end
end

class D < C
end

C.m1
  # when in m1, self is C
C.instance_methods false 
  #=> [:m2] 
C.methods false 
  #=> [:m1] 

class C
  class << self
    def m1
      puts "when in m1, self is #{self}"
      def m2
      end
    end
  end
end

class D < C; end

C.m1
  # when in m1, self is C
C.instance_methods false 
  #=> [] 
C.methods false
  #=> [:m1, :m2]  

1 Ответ

0 голосов
/ 03 апреля 2019

Текущий класс первого фрагмента кода C.Хотя вы определяете m2 в self.m1, текущий класс - C.m2 - это метод экземпляра.

Текущий класс второго фрагмента: singleton_class из C.когда вы пишете class << self, вы открываете одноэлементный класс текущего класса, C в этом случае.Таким образом, m2 является экземпляром метода singleton_class из C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...