Вход/Регистрация
Программирование на языке Ruby
вернуться

Фултон Хэл

Шрифт:

• Во многих языках, и в 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 для этой цели есть специальный оператор

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

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

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

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

  • Читать дальше
  • 1
  • ...
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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