Evgenii Legotckoi
Evgenii Legotckoi26 серпня 2016 р. 03:21

Посібник користувача №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 хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах