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

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

Жанры

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

• 

ARGV[0]
— первый аргумент в командной строке; они нумеруются начиная с нуля. Это не имя файла или сценария, предшествующего параметрам, как
argv[0]
в языке С.

• Большинство операторов в Ruby на самом деле является методами; их запись в виде «знаков препинания» — не более чем удобство. Первое исключение из этого правила — набор операторов составного присваивания (

+=
,
– =
и т.д.). Второе исключение - операторы
=
,
..
,
...
,
!
,
not
,
&&
,
and
,
||
,
or
,
!=
,
!~
.

• Как

и в большинстве современных языков программирования (хотя и не во всех), булевские операции закорачиваются, то есть вычисление булевского выражения заканчивается, как только его значение истинности становится известным. В последовательности операций
or
вычисление заканчивается, когда получено первое значение
true
, а в последовательности операций
and
— когда получено первое значение
false
.

• Префикс

@@
применяется для переменных класса (то есть ассоциированных с классом в целом, а не с отдельным экземпляром).

• 

loop
— не ключевое слово. Это метод модуля
Kernel
, а не управляющая конструкция.

• Кому-то синтаксис

unless-else
может показаться интуитивно неочевидным. Поскольку
unless
— противоположность
if
, то ветвь
else
выполняется, когда условие истинно.

• Простой тип

Fixnum
передается как непосредственное значение и, стало быть, не может быть изменен внутри метода. То же относится к значениям
true
,
false
и
nil
.

• Не путайте операторы

&&
и
||
с операторами
&
и
|
. Те и другие используются в языке С; первые два предназначены для логических операций, последние два — для поразрядных.

• Операторы

and
и
or
имеют более низкий приоритет, чем
&&
и
||
. Взгляните на следующий фрагмент:

а = true

b = false

с = true

d = true

a1 = a && b or с && d # Операции && выполняются первыми.

a2 = a && (b or с) && d # Операция or выполняется первой.

puts a1 # Печатается false

puts a2 # Печатается true

• He забывайте, что «оператор» присваивания имеет более высокий приоритет, чем операторы

and
и
or!
(это относится и к составным операторам присваивания:
+=
,
– =
и пр.). Например, код
x = y or z
выглядит как обычное предложение присваивания, но на самом деле это обособленное выражение (эквивалент
(x=у) or z
). Вероятно, программист имел в виду следующее:
x = (y or z)
.

y = false

z = true

x = y or z # Оператор = выполняется РАНЬШЕ or!

puts x #
Печатается false

(x = y) or z # Строка 5: то же, что и выше.

puts x # Печатается false

x = (y or z) # Оператор or вычисляется сначала.

puts x # Печатается true

• Не путайте атрибуты объектов с локальными переменными. Если вы привыкли к C++ или Java, можете забыть об этом! Переменная

@my_var
в контексте класса — это переменная экземпляра (или атрибут), но
my_var
в том же контексте — локальная переменная.

• Во многих языках, и в Ruby в том числе, есть цикл

for
. Рано или поздно возникает вопрос, можно ли модифицировать индексную переменную. В некоторых языках эту управляющую переменную запрещено изменять вовсе (выводится предупреждение либо сообщение об ошибке на этапе компиляции или выполнения); в других это допустимо, хотя и приводит к изменению поведения цикла. В Ruby принят третий подход. Переменная, управляющая циклом
for
, считается обычной переменной, которую можно изменять в любой момент, но это изменение не оказывает влияния на поведение цикла! Цикл for присваивает этой переменной последовательные значения, что бы с ней ни происходило внутри тела цикла. Например, следующий цикл будет выполнен ровно 10 раз и напечатает значения от 1 до 10:

for var in 1..10

 puts "var = #{var}"

 if var > 5

var = var + 2

 end

end

• Имена переменных не всегда легко «на глаз» отличить от имен методов. Как решает этот вопрос анализатор? Правило такое: если анализатор видит, что идентификатору присваивается значение до его использования, то он считается переменной; в противном случае это имя метода. (Отметим, что операция присваивания может и не выполняться: достаточно того, что интерпретатор ее видел.)

1.5.3. Предложение case в Ruby

Во всех современных языках есть та или иная форма многопутевого ветвления. В C/C++ и Java это предложение

switch
, а в Pascal — предложение
case
. Служат они одной и той же цели и функционируют примерно одинаково.

Предложение

case
в Ruby похоже, но при ближайшем рассмотрении оказывается настолько уникальным, что варианты ветвления, принятые в С и в Pascal, кажутся близкими родственниками. Точного аналога предложению
case
в Ruby нет ни в каком другом знакомом мне языке, поэтому оно заслуживает особого внимания.

Выше мы уже рассматривали синтаксис этого предложения, а теперь сосредоточимся на его семантике.

• Для начала рассмотрим тривиальный пример. Выражение

expression
сравнивается со значением
value
, и, если они совпадают, выполняется некоторое действие. Ничего удивительного.

case expression

 when value

некоторое действие

end

В Ruby для этой цели есть специальный оператор

===
(называется оператором отношения). Иногда его еще называют (не совсем правильно) оператором ветвящегося равенства. Неправильность в том, что он не всегда относится именно к проверке на равенство.

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

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

Шайтан Иван

Тен Эдуард
1. Шайтан Иван
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Шайтан Иван

Ветер перемен

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

Искатель 1

Шиленко Сергей
1. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 1

Идеальный мир для Лекаря

Сапфир Олег
1. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря

Светлая тьма. Советник

Шмаков Алексей Семенович
6. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Светлая тьма. Советник

Двойник короля 18

Скабер Артемий
18. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 18

Воронцов. Перезагрузка. Книга 5

Тарасов Ник
5. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
6.00
рейтинг книги
Воронцов. Перезагрузка. Книга 5

Тьма и Хаос

Владимиров Денис
6. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Тьма и Хаос

Последний Герой. Том 3

Дамиров Рафаэль
3. Последний герой
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
5.00
рейтинг книги
Последний Герой. Том 3

Кодекс Охотника. Книга XXXVI

Винокуров Юрий
36. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXVI

Имя нам Легион. Том 3

Дорничев Дмитрий
3. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 3

Кодекс Охотника. Книга XXXV

Винокуров Юрий
35. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXV

Неудержимый. Книга XV

Боярский Андрей
15. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XV