Все ли методы класса определены с помощью "def self.foo"? - PullRequest
2 голосов
/ 08 ноября 2011

Прав ли я со следующей идеей?Совет / обратная связь приветствуется!


Мы можем сказать, какой метод является методом экземпляра, а какой метод является методом класса, посмотрев, было ли указано ключевое слово self перед именем метода.1006 * Итак, метод, например: def self.foo_bar определен как метод класса.С другой стороны, def foo_bar определяется как метод экземпляра.

Ответы [ 3 ]

4 голосов
/ 08 ноября 2011

Нет, вы не можете сделать это таким образом.Учтите это:

class C
  class << self
    def m
      puts 'pancakes!'
    end
  end
  def i
    puts 'eggs'
  end
end

Это дает вам метод класса m для C без «self» в объявлении метода.Однако вы можете спросить класс о его методах:

C.methods.include? :m
# true
C.methods.include? :i
# false
C.instance_methods.include? :i
# true

И учитывая, насколько изменчивы классы Ruby, запросить класс - это единственный способ быть уверенным.

1 голос
/ 08 ноября 2011

Есть и другие способы определения метода класса, кроме метода с self. в определении класса:

class A
  def A.method1
  end

  class << self
    def method2
    end
  end
end

A.instance_eval do
  def method3
  end
end

module B
  def method4
  end
end

A.extend B

p A.methods.first(4)

# >> [:method1, :method2, :method3, :method4]
0 голосов
/ 08 ноября 2011

Как еще один вариант, вы можете увидеть все ваши методы класса с помощью этого фрагмента:

class C
  class << self
    def first
    end
  end
  def C.second
  end
  def self.third
  end
end

eigenclass = class << C; self; end
eigenclass.instance_methods(false)  # => [:first, :second, :third]

Это потому, что все методы класса являются методами экземпляра собственного класса для этого объекта класса.

...