Что означает класс метода в определении класса в Ruby? - PullRequest
1 голос
/ 06 января 2011

Я знаком с определениями функций и объявлениями переменных в определениях классов:

public class MyClass {
  public int myvar;
  public void doSomething() {

  }
}

Но что это значит в Ruby, когда метод фактически вызывается в определении класса?Это происходит в Rails, например:

class User < ActiveRecord::Base
  has_many :posts
end

Что именно это делает (на более низком уровне, чем «он добавляет некоторые методы в класс»)?Как бы я реализовал такую ​​функцию (например, такую, которая смешивает некоторые дополнительные методы)?

Ответы [ 2 ]

2 голосов
/ 06 января 2011

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

>> class A
>>   def self.hello
>>     puts 'world'
>>   end
>>   hello
>> end
world
=> nil
>> A.hello
world
=> nil
>> class B < A
>>   hello
>> end
world
=> nil

Итак, чтобы продолжить аналогию с ClassName.new, вы можете вызвать любой метод класса таким способом. Давайте использовать new в качестве примера:

>> class C
>>   def happy
>>     puts 'new year'
>>   end
>>   new
>> end.happy
new year
=> nil

Кстати, не смущайтесь тем фактом, что этот метод определен в суперклассе. Q: В чем разница между вашим производным классом и вашим экземпляром суперкласса? Скажи ActiveRecord::Base? A: Ничего! Существует только один экземпляр класса.

1 голос
/ 06 января 2011

ActiveRecord :: Base определил метод класса has_many.Ruby позволяет вам вызывать методы класса суперкласса во время определения подкласса.

Вы можете сделать это самостоятельно, добавив свои собственные методы класса в ActiveRecord :: Base или свой собственный класс, создав модуль, который вы смешиваете.

Простой пример того, как сделать это самостоятельно:

module MyMixin
  def self.included(base)
    base.extend ClassMethods   # Load class methods
    super
  end
  module ClassMethods
    def hello
      puts "MyMixin says => Hello World"
    end
  end
end
ActiveRecord::Base.send :include, MyMixin

Пример использования:

class MyRecord < ActiveRecord::Base
  hello
end

при запуске Rails вы увидите это напечатанное на консоли:

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