Evgenii Legotckoi
Evgenii Legotckoi26 августа 2016 г. 3: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 хостинг.

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

Комментарии

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

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

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

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

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

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

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
i
innorwall15 ноября 2024 г. 3:03
Qt/C++ - Урок 060. Настройка внешнего вида приложения в рантайме I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
i
innorwall14 ноября 2024 г. 19:42
Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
i
innorwall14 ноября 2024 г. 17:09
Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
i
innorwall14 ноября 2024 г. 12:05
EVILEG-CORE. Использование Google reCAPTCHA 2001; 98 29 34 priligy buy
Сейчас обсуждают на форуме
i
innorwall14 ноября 2024 г. 11:39
добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
i
innorwall11 ноября 2024 г. 18:55
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
9
9Anonim25 октября 2024 г. 16:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Игорь Максимов3 октября 2024 г. 11:05
Реализация навигации по разделам Спасибо Евгений!

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