Evgenii Legotckoi
Evgenii Legotckoi26 августа 2016 г. 13:21

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.new**
**ERR: failed to convert nil into String**

Это метод

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

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

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

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

Qt - Тест 001. Сигналы и слоты

  • Результат:84баллов,
  • Очки рейтинга4
Ua

Qt - Тест 001. Сигналы и слоты

  • Результат:42баллов,
  • Очки рейтинга-8
ОК

Qt - Тест 001. Сигналы и слоты

  • Результат:47баллов,
  • Очки рейтинга-6
Последние комментарии
ИМ
Игорь Максимов22 ноября 2024 г. 21:51
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 октября 2024 г. 23:37
Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 октября 2024 г. 17:19
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5 октября 2024 г. 16:51
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55 июля 2024 г. 20:02
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
b
blinds1211 февраля 2025 г. 16:08
Why Bamboo Blinds Are the Perfect Choice for Your Home When it comes to enhancing the aesthetics and functionality of your living space, choosing the right window treatment is crucial. Bamboo blinds have emerged as a popular choice for homeowners wh…
i
imperial313011 февраля 2025 г. 15:40
How to Select the Right Carpet for Your Bedroom Aesthetic Choosing the perfect carpet for your bedroom involves more than just picking a color or pattern you like. Carpets can transform the ambiance of your space, adding warmth, comfort, and style. How…
c
carpetstore11 февраля 2025 г. 15:13
How to Choose the Perfect Red Carpet for Any Event A red carpet instantly adds elegance and sophistication to any event, making guests feel like VIPs. Whether you're hosting a corporate gala, a wedding, a movie premiere, or a private party, choo…
g
gypsumpartition11 февраля 2025 г. 12:24
Why Choose Gypsum Wall Partitions for Your Interior Design? When it comes to interior design, creating functional and aesthetically pleasing spaces is essential. One of the most versatile and practical solutions for dividing spaces is gypsum wall partiti…
Дмитрий
Дмитрий3 февраля 2025 г. 16:24
Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…

Следите за нами в социальных сетях