В ruby, что это за определение типа: self.class.method - PullRequest
4 голосов
/ 02 февраля 2012

Я NOOB, пытающийся понять какой-то код.

Что делает этот self.class.current_section?

class MyClass
  class << self  
    def current_section(*section)
      if section.empty?
        @current_section
      else
        @current_section = section[0]
      end
    end
  end


  def current_section()
    self.class.current_section
  end

  def current_section=(section)
    self.class.current_section(section)
  end
end

Ответы [ 3 ]

3 голосов
/ 02 февраля 2012

self возвращает текущий объект.

self.class возвращает класс текущего объекта.

self.class.current_section вызывает метод класса текущего объекта (этот метод называется current_section).

 def current_section()
    p self
    p self.class
 end

 current_section()
1 голос
/ 02 февраля 2012
class << self  
    def current_section(*section)
      if section.empty?
        @current_section
      else
        @current_section = section[0]
      end
    end
end

Эта часть кода оценивается в области объекта класса из-за оператора class << self.Таким образом, current_section определяется как метод класса, который вызывается как Myclass.current_section.

def current_section()
  self.class.current_section
end

Эта часть является просто определением метода экземпляра, и, таким образом, self является экземпляром Myclassобъект.

self.class получает класс такого экземпляра, таким образом, Myclass, и вызывается метод current_section класса.

1 голос
/ 02 февраля 2012

Пересылает сообщение (запрос вызова метода), полученное объектом, в соответствующий класс.

Скажем, у вас есть класс

class MyClass
  def MyClass.current_section
    puts "I'm the class method."
  end

  def current_section
    self.class.current_section
  end
end

h = MyClass.new
h.current_section # outputs "I'm the class method."

Вызывая метод h, он ищет класс h (MyClass) и вызывает метод current_section этого класса.

Итак, согласно приведенным выше определениям, каждый объект класса MyClass имеет метод current_section, который направляется в центральный current_section класса.

Определение методов класса в вашем вопросе просто использует другой синтаксис для того же: добавление метода к объекту класса.

...