Что используется в классах / статических методах в ruby?

изучая ruby и oop в целом, я наткнулся на методы класса, которые, насколько я понимаю, похожи на методы экземпляра, но доступны из класса, а не из объекта, и могут иметь только один запуск одновременно.

однако я не понимаю, почему вы используете метод класса versuses обычный метод (вне класса) и что даже их использование?

например:

#Why would you use:
class Foo
  def self.bar
    puts "Class method"
  end
end

#Versus simply:
def bar
  puts "Normal method"
end

Foo.bar # => Class method
bar # => Normal method

как они оба дают один и тот же результат? Я совсем запуталась о них, поэтому, пожалуйста, исправьте, если я неправильно понимаю любое / все здесь.

5 ответов


ваш пример не очень хороший.

методы класса могут иметь дело с управлением всеми экземплярами, которые существуют класса, и методы экземпляра имеют дело с одним экземпляром за раз.

class Book
  def self.all_by_author(author)
    # made up database call
    database.find_all(:books, where: { author: author }).map do |book_data|
      new book_data # Same as: Book.new(book_data)
    end
  end

  def title
    @title
  end
end


books = Book.all_by_author('Jules Vern')
books[0].title #=> 'Journey to the Center of the Earth'

в этом примере у нас есть класс с именем Book. Он имеет метод класса all_by_author. Он запрашивает некоторую базу данных pretend и возвращает массив Book экземпляров. Метод экземпляра title получает название одного Book экземпляра.

Итак, метод класса управление коллекцией экземпляров, и метод instance управляет только этим экземпляром.


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


Как вы и сказали, они:

  • "доступ из класса, а не из объекта и"
  • " может иметь только один запуск в то же время."

помните также, что класс является портативным


Это больше вопрос ООП, чем рубиновый. Методы класса в ruby используются так же, как и в других языках программирования OO. Это значит:

  • методы класса выполняются в контексте класса (и иметь доступ только к переменным класса)
  • методы экземпляра выполняются в контексте объекта (и имеют доступ к переменным объекта или экземпляра)

вот лучший пример:

class Foo
  def self.bar
    puts 'class method'
  end

  def baz
    puts 'instance method'
  end
end

Foo.bar # => "class method"
Foo.baz # => NoMethodError: undefined method ‘baz’ for Foo:Class

Foo.new.baz # => instance method
Foo.new.bar # => NoMethodError: undefined method ‘bar

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

пример копируется из здесь, где вы также можете найти более подробную информацию по этому вопросу.

имейте в виду: хотя любой код может быть помещен в класс или метод экземпляра, каждый из них имеет собственные варианты использования и собственные плюсы и минусы. В ООП мы стремимся к многоразовому, гибкому и читаемому коду, что означает, что мы обычно хотим поместить большую часть код структурирован как методы экземпляра в разумной модели домена.


самое главное, что он держит ваш код организован. Когда у вас есть сотни тысяч строк кода, их беспорядочное разбрасывание в одном пространстве имен может стать кошмаром. Организация действительно важна,а пространства имен-это простой способ получить модульность с поддержкой языка.

несколько менее важно, методы класса / модуля могут совместно использовать состояние без утечки его повсюду (например, классы могут иметь экземпляр переменные), и они могут иметь частные методы поддержки, чтобы обеспечить лучший Факторинг, в то время как глобальные методы не могут быть эффективно сделаны частными.


у вас много недоразумений,

в ruby мы можем определить класс и метод экземпляра.

метод класса используется для обеспечения обработки на уровне класса, т. е. данных, которые могут быть доступны только на уровне класса или связаны со всеми объектами. Например, для подсчета количества объектов, принадлежащих классу, необходим метод class. Как

Foo.count  

таким же образом, чтобы обработать один объект, вам нужен метод объекта для обработки одного объекта как,

obj.save

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