Является ли Ruby хорошим языком для начала вашего пути в программирование?

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

Круто, теперь у нас есть экземпляр собаки fido, который имеет имя «Fido» и тоже может лаять. Просто, инициализируйте его, он возвращает то, что вы ожидаете. Ничего фантастического.

Что ж, следующее, что мы видим, это ЭТО «attr_…», и их 3. «attr_accessor», «attr_reader» и «attr_writer». Что это? Создадим класс Person. Конечно, у человека есть имя, которое нужно идентифицировать, у него есть цвет волос, и, как у каждого человека, у него есть свои дела.

Человеку дали имя Евгений и странным образом покрасили волосы в белый цвет. Но ему нечего делать. Давайте изменим его цвет волос.

ev.hair_color=черный”

ev.hair_color

=› черный

Успех! Он покрасил волосы. Почему-то ему не нравится его имя, и он решил его изменить.

ev.name=yev

NoMethodError: неопределенный метод `name=’ for #‹Person:0x00007fd45f0a5bf0› Вы имели в виду? название

Подождите, он не может! Что случилось? «Неопределенное имя метода =»

Вот чем это интересно. Нет способа изменить имя, но есть способ изменить цвет волос, и все, что мы видим, это «attr_…». Попробуем добавить чем заняться.

yev.things_to_do=оплатите мои счета завтра

yev.things_to_do=купить подарок девушке

Никаких ошибок, мы добавили вещи. Теперь давайте посмотрим весь список вещей, которые этот человек должен сделать.

yev.things_to_do

NoMethodError: неопределенный метод `things_to_do' для #‹Person:0x00007fd45f0a5bf0›

Опять же, без метода. Что на самом деле происходит за кулисами? Мы можем достичь той же функциональности, определив наш класс Person таким образом.

На самом деле происходит следующее:

Когда объект ev создается, он передает методу initialize» две строки «Евгений» и «белый». Метод присваивает первую строку имени переменной, а вторую — переменной hair_color, и, наконец, создает массив с именем Things_to_do. Все три переменные теперь принадлежат объекту ev. Вот сложная часть; у нас есть переменные, но для управления этими переменными нам нужны методы. При вызове объекта «yev» получаем

#‹Person:0x00007fbbab10c430 @hair_color=white, @name=Евгений, @things_to_do=[оплати мои счета завтра”, ”купи подарок девушке”]

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

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

Первый, «hair_color», возвращает return @hair_color — переменную, принадлежащую объекту, вызвавшему метод.

Второй метод «hair_color=» принимает параметр и присваивает его объектной переменной, вызвавшей метод.

Третий метод «name» имеет ту же функциональность, что и«hair_color», который возвращаетэкземпляр переменной «name».

Последний — «things_to_do=», он принимает аргумент и добавляет его в массив, принадлежащий экземпляру, вызвавшему метод.

Как мы видим, все три переменные, принадлежащие экземпляру «ev», имеют разную функциональность. Эта функциональность определяется методами экземпляра. Если мы оглянемся назад, как мы определили все эти переменные в первом методе, мы сможем выяснить, что делает каждая из них, или, другими словами, что определено каждой из них.

Давайте сначала посмотрим на «attr_writer». Он явно может что-то в него присвоить, то есть записать в него, но не смог посмотреть, что добавлено.

Второй — «attr_reader». Переменная была инициализирована значением, мы можем посмотреть ее содержимое, но не можем его изменить.

Последнее, и не менее важное, «attr_accessor». Это позволило посмотреть на переменную и изменить ее.

Так что же происходит на самом деле? Как человек, начавший свой путь в программировании с Java, я изучаю его на собственном горьком опыте. Давайте посмотрим, как то же самое поведение реализовано в Java.

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

Та же идея есть и в Ruby, но мы ее не видим. Все, что мы видим, это «attr_…». Давайте откроем шторы и посмотрим, что рубин делает для нас с каждым из них.

«attr_reader» — создает переменную и определяет метод для возврата этой переменной. С точки зрения Java, Getter. Но нет способа изменить переменную или установить переменную. Поэтому, если вы не присвоили ему значение в процессе инициализации, значение не будет присвоено.

«attr_writer» — создает переменную и определяет метод изменения значения переменной. Другими словами, установите переменную. Но не способ посмотреть на него или получить его.

«arrt_accessor» — делает все. Создает переменную и определяет методы для ее получения и установки.

Написав «attr_accessor», на самом деле происходит то, что Ruby делает за нас грязную работу, создает переменную, создает метод для получения значения этой переменной и метод для изменения значения этой переменной. В терминологии Java «геттер и сеттер»

Визуализация того, что находится за кулисами:

Хорошо ли, что Ruby скрывает от нас все эти методы, или эта абстракция только добавляет путаницы? На мой взгляд, все в той или иной степени ленивы, всем нравятся короткие пути и простые способы достижения одной и той же цели. Поэтому иметь простое решение для избыточных задач — хорошая возможность. С другой стороны, новички видят только одну строку кода, в которой нет объяснения того, что она делает, будь то метод или какова его функциональность.

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