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

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

Жанры

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

• Предыдущее предложение можно записать и так:

if value === expression

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

end

• Не путайте оператор отношения с оператором проверки на равенство (

==
). Они принципиально различны, хотя во многих случаях ведут себя одинаково. Оператор отношения определен по-разному в разных классах, а для данного класса его поведение может зависеть от типа переданного операнда.

• Не думайте, что проверяемое выражение — это объект, которому сравниваемое значение передается в качестве параметра.

На самом деле как раз наоборот (мы это только что видели).

• Это подводит нас к наблюдению, что

x===y
означает вовсе не то же самое, что 
y===x
! Иногда результат совпадает, но в общем случае оператор отношения не коммутативен. (Именно поэтому нам не нравится термин «оператор ветвящегося равенства» — ведь проверка на равенство всегда коммутативна.) Если перевернуть исходный пример, окажется, что следующий код ведет себя иначе:

case value

 when expression

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

end

• В качестве примера рассмотрим строку

str
и образец (регулярное выражение)
pat
, с которым эта строка успешно сопоставляется.

Выражение

str =~ pat
истинно, как в языке Perl. Поскольку Ruby определяет противоположную семантику оператора
=~
в классе
Regexp
, можно также сказать, что выражение
pat =~ str
истинно. Следуя той же логике, мы обнаруживаем, что истинно и
pat === str
(исходя из того, как определен оператор
===
в классе
Regexp
). Однако выражение
str === pat
истинным не является. А значит, фрагмент

case "Hello"

 when /Hell/

puts "Есть соответствие."

 else

puts "Нет соответствия."

end

делает не то же самое, что фрагмент

case /Hell/

 when "Hello"

puts "Есть соответствие."

 else

puts "Нет соответствия."

end

Если это вас смущает, просто постарайтесь запомнить. А если не смущает, тем лучше!

• Программисты, привыкшие к С, могут быть озадачены отсутствием предложений

break
в ветвях
case
. Такое использование
break
в Ruby необязательно (и недопустимо). Связано это с тем, что «проваливание» редко бывает желательно при многопутевом ветвлении. В конце каждой ветви
when
имеется неявный переход на конец предложения
case
. В этом отношении Ruby напоминает Pascal.

• Значения в каждой ветви

case
могут быть произвольными. На типы никаких ограничений не налагается. Они не обязаны быть константами; допускаются и переменные, и сложные выражения. Кроме того, в ветви может проверяться попадание
в диапазон.

• В ветвях

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

case x

 when 0

 when 1..5

puts "Вторая ветвь"

 when 5..10

puts "Третья ветвь"

 else

puts "Четвертая ветвь"

end

Если x принимает значение 0, ничего не делается. Для значения 5 печатается строка «Вторая ветвь» — несмотря на то что 5 удовлетворяет и условию в третьей ветви.

• Перекрытие ветвей допускается потому, что они вычисляются в строгом порядке и выполняется закорачивание. Иными словами, если вычисление выражения в какой-то ветви оказалось успешным, то следующие ветви не вычисляются. Поэтому не стоит помещать в ветви

case
выражения, в которых вызываются методы с побочными эффектами. (Впрочем, такие вызовы в любом случае сомнительны). Имейте также в виду, что такое поведение может замаскировать ошибки, которые произошли бы во время выполнения, если бы выражение вычислялось. Например:

case x

 when 1..10

puts "Первая ветвь"

 when foobar # Возможен побочный эффект?

puts "Вторая ветвь"

 when 5/0 # Деление на нуль!

puts "Третья ветвь"

 else

puts "Четвертая ветвь"

end

Если x находится в диапазоне от 1 до 10, то метод

foobar
не вызывается, а выражение 5/0 (которое, естественно, привело бы к ошибке) не вычисляется.

1.5.4. Рубизмы и идиомы

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

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

• С помощью ключевого слова

alias
можно давать глобальным переменным и методам альтернативные имена (синонимы).

• Пронумерованные глобальные переменные

$1
,
$2
,
$3
и т.д. не могут иметь синонимов.

• Мы не рекомендуем использовать «специальные переменные»

$=
,
$_
,
$/
и им подобные. Иногда они позволяют написать более компактный код, но при этом он не становится более понятным. Поэтому в данной книге мы прибегаем к ним очень редко, что и вам рекомендуем.

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

Мишень

Коултер Кэтрин
3. Агенты ФБР
Любовные романы:
остросюжетные любовные романы
8.32
рейтинг книги
Мишень

Сердце Дракона. Том 10

Клеванский Кирилл Сергеевич
10. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.14
рейтинг книги
Сердце Дракона. Том 10

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Последний Паладин. Том 14

Саваровский Роман
14. Путь Паладина
Фантастика:
аниме
фэнтези
попаданцы
5.75
рейтинг книги
Последний Паладин. Том 14

Черная метка

Лисина Александра
7. Гибрид
Фантастика:
технофэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Черная метка

Уарда

Эберс Георг Мориц
Проза:
историческая проза
8.00
рейтинг книги
Уарда

Афганский рубеж 3

Дорин Михаил
3. Рубеж
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Афганский рубеж 3

Виконт. Книга 2. Обретение силы

Юллем Евгений
2. Псевдоним `Испанец`
Фантастика:
боевая фантастика
попаданцы
рпг
7.10
рейтинг книги
Виконт. Книга 2. Обретение силы

Вор

Леонов Леонид Максимович
Проза:
классическая проза
6.83
рейтинг книги
Вор

Последний Паладин. Том 7

Саваровский Роман
7. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 7

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

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

Я еще князь. Книга XX

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

Наномашины, внучок! Том 2

Новиков Николай Васильевич
2. Чего смотришь? Иди книгу читай
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наномашины, внучок! Том 2

Отморозок 3

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