Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

Обратите внимание, что переменная x, которой присвоено значение 1, — это новая переменная, определенная на верхнем уровне. Она не совпадает с одноименной переменной, определенной внутри блока. Замыкание печатает 5, так как запоминает контекст своего создания, в котором была определена переменная

x
со значением 5.

• Переменные с именами, начинающимися с одного символа

@
, определенные внутри класса, — это, вообще говоря, переменные экземпляра. Однако если они определены вне любого метода, то становятся переменными экземпляра класса. (Это несколько противоречит общепринятой терминологии ООП, в которой «экземпляр класса» — то же самое, что и «экземпляр>>
или «объект».) Пример:

class Myclass

 @x = 1 # Переменная экземпляра класса.

 @y = 2 # Еще одна.

 def mymethod

@x = 3 # Переменная экземпляра.

# Заметим, что в этой точке @y недоступна.

 end

end

Переменная экземпляра класса (

@y
в предыдущем примере — в действительности атрибут объекта класса
Myclass
, являющегося экземпляром класса
Class
. (Напомним, что
Class
— это объект, a
Object
— это класс.) На переменные экземпляра класса нельзя ссылаться из методов экземпляра и, вообще говоря, они не очень полезны.

attr
,
attr_reader
,
attr_writer
и
attr_accessor
— сокращенная запись для определения методов чтения и установки атрибутов. В качестве аргументов они принимают символы (экземпляры класса
Symbol
).

• Присваивание переменной, имя которой содержит оператор разрешения области видимости, недопустимо. Например,

Math::Pi = 3.2
— ошибка.

1.5.5. Ориентация на выражения и прочие вопросы

В Ruby выражения важны почти так же, как предложения. Для программиста на С это звучит знакомо, а для программиста на Pascal — откровенная нелепость. Но Ruby ориентирован на выражения даже в большей степени, чем С.

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

• В Ruby любое присваивание возвращает то же значение, которое стоит в правой части. Поэтому иногда мы можем немного сократить код, как показано ниже, но будьте осторожны, имея дело с объектами! Не забывайте, что это почти всегда ссылки.

x = y = z = 0 # Все переменные сейчас равны 0.

а = b = с = [] # Опасно! a, b и с ссылаются

# на ОДИН И ТОТ ЖЕ пустой массив.

x = 5

y = x += 2 # Сейчас x и у равны 7.

Напомним однако, что значения типа

Fixnum
и им подобные хранятся непосредственно, а не как ссылки на объекты.

• Многие управляющие конструкции возвращают значения, в частности

if
,
unless
и
case
. Следующий код корректен; он показывает, что при принятии решения ветви могут быть выражениями, а не полноценными предложениями.

а = 5

x = if а < 8 then 6 else 7 end # x равно 6.

y= if a<8 # y тоже равно 6;

 6 #
предложение if может располагаться

else # на одной строке

 7 # или на нескольких.

end

# unless тоже работает; z присваивается значение 4.

z = unless x == y then 3 else 4 end

t = case a # t получает

 when 0..3 # значение

"low" # medium,

 when 4..6

"medium"

 else

"high"

end

Здесь мы сделали такие отступы, будто

case
является присваиванием. Мы воспринимаем такую запись спокойно, хотя вам она может не понравиться.

• Отметим, что циклы

while
и
until
, напротив, не возвращают никаких полезных значений; обычно их значением является
nil
:

i = 0

x = while (i < 5) # x равно nil.

 puts i+=1

end

• Тернарный оператор можно использовать как в предложениях, так и в выражениях. В силу синтаксических причин (или ограничений анализатора) скобки здесь обязательны:

x = 6

y = x == 5 ? 0 : 1 #y равно 1.

x == 5 ? puts("Привет") : puts("Пока") # Печатается: "Пока"

• Предложение

return
в конце метода можно опускать. Метод всегда возвращает значение последнего вычисленного выражения, в каком бы месте это вычисление ни происходило.

• Когда итератор вызывается с блоком, последнее выражение, вычисленное в блоке, возвращается в качестве значения блока. Если при этом в теле итератора есть предложение

x = yield
, то
x
будет присвоено это значение.

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

/m
, и в этом случае точка (
.
) будет сопоставляться с символом новой строки.

 Регулярные выражения. Опасайтесь соответствий нулевой длины. Если все элементы регулярного выражения необязательны, то такому образцу будет соответствовать «ничто», причем соответствие всегда будет найдено в начале строки. Это типичная ошибка, особенно часто ее допускают новички.

1.6. Жаргон Ruby

Заново начинать учить английский для освоения Ruby необязательно. Но нужно знать кое-какие жаргонные выражения, обычные в сообществе. Некоторые из них имеют другой смысл, чем принято в компьютерном мире. Им и посвящен настоящий раздел.

В Ruby термин «атрибут» носит неофициальный характер. Можно считать, что атрибут — это переменная экземпляра, которая раскрывается внешнему миру с помощью одного из методов семейства

attr
. Но тут нет полной определенности: могут существовать методы
foo
и
foo=
, не соответствующие переменной
@foo
, как можно было бы ожидать. И, конечно, не все переменные экземпляра считаются атрибутами. Как обычно, нужно придерживаться здравого смысла.

Поделиться:
Популярные книги

Газлайтер. Том 2

Володин Григорий
2. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 2

Я снова князь. Книга XXIII

Дрейк Сириус
23. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я снова князь. Книга XXIII

Его звали Тони. Книга 5

Кронос Александр
5. Щенки косуль
Фантастика:
городское фэнтези
технофэнтези
попаданцы
7.00
рейтинг книги
Его звали Тони. Книга 5

Третий. Том 6

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
фантастика: прочее
попаданцы
5.00
рейтинг книги
Третий. Том 6

#Бояръ-Аниме. Газлайтер. Том 37

Володин Григорий Григорьевич
37. История Телепата
Фантастика:
фэнтези
аниме
боевая фантастика
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 37

Законы Рода. Том 5

Мельник Андрей
5. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 5

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений

Камень Книга седьмая

Минин Станислав
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.22
рейтинг книги
Камень Книга седьмая

Наследник, скрывающий свой Род

Тарс Элиан
2. Десять Принцев Российской Империи
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Наследник, скрывающий свой Род

Долг

Кораблев Родион
7. Другая сторона
Фантастика:
боевая фантастика
5.56
рейтинг книги
Долг

Менталист. Эмансипация

Еслер Андрей
1. Выиграть у времени
Фантастика:
альтернативная история
7.52
рейтинг книги
Менталист. Эмансипация

Светлейший князь

Злотников Роман Валерьевич
4. Император и трубочист
Фантастика:
героическая фантастика
альтернативная история
5.00
рейтинг книги
Светлейший князь

Отморозок 5

Поповский Андрей Владимирович
5. Отморозок
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Отморозок 5

Рассвет русского царства 3

Грехов Тимофей
3. Новая Русь
Фантастика:
историческое фэнтези
альтернативная история
5.00
рейтинг книги
Рассвет русского царства 3