Я тоже столкнулся с этой проблемой и написал несколько длинный ответ на этот вопрос.На этот счет уже есть несколько хороших ответов, но всем, кто ищет более подробного объяснения, я надеюсь, что мой ответ может помочь
Метод инициализации
Инициализация позволяет вам устанавливать данные для экземпляра объекта при созданииэкземпляра, вместо того, чтобы устанавливать их в отдельной строке кода каждый раз, когда вы создаете новый экземпляр класса.
class Person
attr_accessor :name
def initialize(name)
@name = name
end
def greeting
"Hello #{@name}"
end
end
person = Person.new("Denis")
puts person.greeting
В приведенном выше коде мы устанавливаем имя «Денис», используя метод инициализации, передав Деннису через параметр в «Инициализация».Если бы мы хотели установить имя без метода инициализации, мы могли бы сделать это следующим образом:
class Person
attr_accessor :name
# def initialize(name)
# @name = name
# end
def greeting
"Hello #{name}"
end
end
person = Person.new
person.name = "Dennis"
puts person.greeting
В приведенном выше коде мы устанавливаем имя, вызывая метод установки attr_accessor с использованием person.name, а неустановка значений при инициализации объекта.
Оба «метода» выполнения этой работы, но инициализация экономят нам время и строки кода.
Это единственная работа инициализации.Вы не можете вызвать инициализацию как метод.Чтобы реально получить значения объекта экземпляра, вам нужно использовать методы получения и установки (attr_reader (get), attr_writer (set) и attr_accessor (оба)).Подробнее об этом см. Ниже.
Получатели, сеттеры (attr_reader, attr_writer, attr_accessor)
Получатели, attr_reader: Цель геттера - вернуть значение конкретной переменной экземпляра,Посетите пример кода ниже для разбивки этого.
class Item
def initialize(item_name, quantity)
@item_name = item_name
@quantity = quantity
end
def item_name
@item_name
end
def quantity
@quantity
end
end
example = Item.new("TV",2)
puts example.item_name
puts example.quantity
В приведенном выше коде вы вызываете методы «item_name» и «amount» в экземпляре Item «example».«Put example.item_name» и «example.quantity» вернут (или «получат») значение для параметров, переданных в «example», и отобразят их на экране.
К счастью в Rubyесть собственный метод, который позволяет нам писать этот код более кратко;метод attr_reader.См. Код ниже;
class Item
attr_reader :item_name, :quantity
def initialize(item_name, quantity)
@item_name = item_name
@quantity = quantity
end
end
item = Item.new("TV",2)
puts item.item_name
puts item.quantity
Этот синтаксис работает точно так же, только он экономит нам шесть строк кода.Представьте, если бы у вас было еще 5 состояний, относящихся к классу Item?Код быстро стал бы длинным.
Сеттеры, attr_writer: Сначала меня поразили методы сеттера, что, на мой взгляд, казалось, что он выполняет функцию, идентичную методу инициализации.Ниже я объясняю разницу на основе моего понимания;
Как указывалось ранее, метод initialize позволяет вам устанавливать значения для экземпляра объекта при создании объекта.
Но что если вы захотите установить значения позже, после создания экземпляра или изменить их после инициализации?Это будет сценарий, в котором вы будете использовать метод установки.ЭТО РАЗНИЦА.Вам не нужно «устанавливать» определенное состояние, когда вы изначально используете метод attr_writer.
Приведенный ниже код является примером использования метода установки для объявления значения item_name для этого экземпляра класса Item.Обратите внимание, что мы продолжаем использовать метод getter attr_reader, чтобы мы могли получать значения и выводить их на экран, на тот случай, если вы захотите протестировать код самостоятельно.
class Item
attr_reader :item_name
def item_name=(str)
@item_name = (str)
end
end
Приведенный ниже код является примером использования attr_writer для повторного сокращения нашего кода и экономии времени.
class Item
attr_reader :item_name
attr_writer :item_name
end
item = Item.new
puts item.item_name = "TV"
Приведенный ниже код является повторением приведенного выше примера инициализациигде мы используем initialize, чтобы установить значение объекта item_name при создании.
class Item
attr_reader :item_name
def initialize(item_name)
@item_name = item_name
end
end
item = Item.new("TV")
puts item.item_name
attr_accessor: выполняет функции как attr_reader, так и attr_writer, сохраняя вам еще одну строку кода.