User Guide #26 - Ruby - Аксессоры

Что такое аксессор?

Мы кратко обсудили @-переменные в предшествующих главах, но мало поэкспериментировали с ними.  @-переменные объекта являются его атрибутами, тем, что обычно отличает его от других объектов этого же класса.  Важно иметь возможность задавать и считывать значения атрибутов; для этого необходимо написание методов, называемых аксессорами атрибутов .  Через мгновение мы увидим, что не всегда нужно явное задание аксессоров, но давайте сейчас полностью пройдем по этому пути.  Есть два вида аксессоров - writers и readers .

ruby> class Fruit
    |   def set_kind(k)  # a writer
    |     @kind = k
    |   end
    |   def get_kind     # a reader
    |     @kind
    |   end
    | end   nil
ruby> f1 = Fruit.new   #<Fruit:0xfd7e7c8c>
ruby> f1.set_kind("peach")  # use the writer   "peach"
ruby> f1.get_kind           # use the reader   "peach"
ruby> f1                    # inspect the object
   #<Fruit:0xfd7e7c8c @kind="peach">

Достаточно просто; мы можем сохранять и считывать информацию о том, на фрукт какого вида мы смотрим.  Но имена наших методов слегка многословны.  Пример далее имеет более ясный и привычный вид:

ruby> class Fruit
    |   def kind=(k)
    |     @kind = k
    |   end
    |   def kind
    |     @kind
    |   end
    | end   nil
ruby> f2 = Fruit.new   #<Fruit:0xfd7e7c8c>
ruby> f2.kind = "banana"   "banana"
ruby> f2.kind   "banana"

Метод inspect

Краткое отступление.  Вы уже заметили, что когда мы прямо рассматриваем объект, нам показывают нечто загадочное, типа #<anObject:0x83678> .  Это просто действие по умолчанию, и мы свободно можем изменить его.  Все, что нужно сделать - это добавить метод inspect в определение класса.  Он должен возвращать строковое значение, описывающее объект подходящим способом, включая состояние всех или некоторых @-переменные.

ruby> class Fruit
    |   def inspect
    |     "a fruit of the " + @kind + " variety"
    |   end
    | end   nil
ruby> f2   "a fruit of the banana variety"

Ему соответствует метод to_s (перевести в строку), который используется для вывода на печать объекта.  В общем случае, можно представлять себе inspect как средство, используемое при написании и отладке программ, а to_s как способ обогащения вывоа программы. eval.rb использует inspect для вывода результатов.  Вы можете использовать метод p для выполнения простого вывода при отладке программы.

# Эти две строки эквивалентны:
p anObject
print anObject.inspect, "\n"

Легкий способ создания аксессоров

Поскольку многие @-переменные нуждаются в применении аксессоров, Ruby предоставляет удобные сокращения для стандартных форм.

Сокращение

Эффект (значение)

attr_reader :v

def v; @v; end

attr_writer :v

def v=(value); @v=value; end

attr_accessor :v

attr_reader :v; attr_writer :v

attr_accessor :v, :w

attr_accessor :v; attr_accessor :w

Давайте воспользуемся этими преимуществами и добавим в пример информацию о свежести.  Сперва мы затребуем автоматическую генерацию reader-а и writer-а, а затем включим новую информацию в inspect :

ruby> class Fruit
    |   attr_accessor :condition
    |   def inspect
    |     "a " + @condition + @kind"
    |   end
    | end   nil
ruby> f2.condition = "ripe"   "ripe"
ruby> f2   "a ripe banana"

More fun with fruit

Никто не ест гнилые фрукты - так пусть время делает свое черное дело.

ruby> class Fruit
    |   def time_passes
    |     @condition = "rotting"
    |   end
    | end   nil
ruby> f2   "a ripe banana"
ruby> f2.time_passes   "rotting"
ruby> f2   "a rotting banana"

Но играя с нашим классом, мы внесли некоторую проблему. Что будет, если мы попытаемся сейчас создать третий фрукт?  Вспомните, @-переменные не существуют до тех пор, пока им не присваивается какое-либо значение.

ruby> f3 = Fruit.newERR: failed to convert nil into String

Это метод inspect жалуется здесь, и на то есть причина.  Мы попросили его дать отчет о типе и состоянии фрукта, но до сих пор f3 не был присвоен не один атрибут.  Если бы мы пожелали, то можно было бы переписать метод inspect таким образом, чтобы он проверял определенность @-переменных используя метод defined? и давал по ним отчет только при положительном исходе, но, наверное, так будет не учень хорошо; т.к. каждый фрукт имеет вид и состояние, то желательно было бы каким-либо образом обеспечить их задание.  Это и будет темой следующей главы.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Поддержать автора Donate

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Как стать автором?

Внесите вклад в развитие сообщества EVILEG.

Узнайте, как стать автором сайта.

Изучить
Donate

Добрый день, Дорогие Пользователи !!!

Я Евгений Легоцкой, разработчик EVILEG. И это мой хобби-проект, который помогает учиться программированию другим программистам и разработчикам

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

PayPalYandex.Money
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг Timeweb
s
3 июня 2020 г. 1:56
silo1995

C++ - Тест 003. Условия и циклы

  • Результат:35баллов,
  • Очки рейтинга-10
АП
2 июня 2020 г. 21:11
Алексей Пикенин

C++ - Тест 005. Структуры и Классы

  • Результат:75баллов,
  • Очки рейтинга2
2 июня 2020 г. 13:04
Даниил Чижевский

C++ - Тест 001. Первая программа и типы данных

  • Результат:86баллов,
  • Очки рейтинга6
Последние комментарии
3 июня 2020 г. 5:16
Евгений Легоцкой

Django - Урок 048. Как добавить статус онлайн на сайте

Добрый день. Конечно, нужно будет только шаблонный тег написать, который будет забирать всех пользователей онлайн, проверяя группу текущего пользователя. У меня пользователи онлайн на …
3 июня 2020 г. 4:43
Владислав Меленчук

Django - Урок 048. Как добавить статус онлайн на сайте

Доброго дня. А можно реализовать с помощью этой фичи вывод блок "Пользователи онлайн" и окрашивать взависимости от группы юзера? Как в скрине ниже. Screenshot_36.png
31 мая 2020 г. 8:15
IscanderChe

Как установить OpenCV на Qt под Windows

Добавлю от себя: на Windows 10 x64 с MinGW 7.3.0 в CMake надо установить флаг OPENCV_ENABLE_ALLOCATOR_STATS=OFF, тогда всё скомпилится нормально.
29 мая 2020 г. 13:00
Евгений Легоцкой

Django - Урок 023. Like Dislike система с помощью GenericForeignKey

Думал так, но похоже что нет. {{ post.votes.likes.user.username }} Это же QuerySet будет, а не отдельный единственный объект {% for vote in post.votes %} {{ vote.user.username …
Сейчас обсуждают на форуме
f
3 июня 2020 г. 1:49
fryn3

Можно ли сделать в QML таблицу как в Excel?

edi-tableview - нашел пока такое выглядит коряво, посмотрим что можно сделать
2 июня 2020 г. 2:46
Евгений Легоцкой

Медиа файлы Google Firebase

Картинки можете попробовать сжимать через QPixmap, там есть возможность установки scaleFactor, через него можете устанавливать нужные параметры. А что касается конвертации видео, то лучше п…
2 июня 2020 г. 2:01
Евгений Легоцкой

Перехват обращения к локальным файлам QWebEngineView

В вашем случае вполне адекватное решение. Так сказать меньше зло. В противном случае пришлось бы очень много переписывать и перепиливать.
a
1 июня 2020 г. 10:26
alekseyttrv

SSL на Android

у меня стоит версия Qt 5.14.2. В настройках android поставил openssl из коробки, и этот прроект автоматически стянулся. Достаточно было только добавить в .pro-файл строку после этого и все …
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB