Что используется в классах / статических методах в 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
Итак, метод класса является примером шаблона синглетного дизайна, где объект может иметь собственную реализацию того же метода.