Хэл Фултон - Программирование на языке Ruby

Все авторские права соблюдены. Напишите нам, если Вы не согласны.
Описание книги "Программирование на языке Ruby"
Описание и краткое содержание "Программирование на языке Ruby" читать бесплатно онлайн.
Ruby — относительно новый объектно-ориентированный язык, разработанный Юкихиро Мацумото в 1995 году и позаимствовавший некоторые особенности у языков LISP, Smalltalk, Perl, CLU и других. Язык активно развивается и применяется в самых разных областях: от системного администрирования до разработки сложных динамических сайтов.
Книга является полноценным руководством по Ruby — ее можно использовать и как учебник, и как справочник, и как сборник ответов на вопросы типа «как сделать то или иное в Ruby». В ней приведено свыше 400 примеров, разбитых по различным аспектам программирования, и к которым автор дает обстоятельные комментарии.
Издание предназначено для программистов самого широкого круга и самой разной квалификации, желающих научиться качественно и профессионально работать на Ruby.
• Переменные в Ruby не объявляются, однако считается хорошим тоном присваивать переменной начальное значение nil. Разумеется, при этом с переменной не ассоциируется никакой тип и даже не происходит истинной инициализации, но анализатор знает, что данное имя принадлежит переменной, а не методу.
• 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 для этой цели есть специальный оператор === (называется оператором отношения). Иногда его еще называют (не совсем правильно) оператором ветвящегося равенства. Неправильность в том, что он не всегда относится именно к проверке на равенство.
• Предыдущее предложение можно записать и так:
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 могут быть произвольными. На типы никаких ограничений не налагается. Они не обязаны быть константами; допускаются и переменные, и сложные выражения. Кроме того, в ветви может проверяться попадание в диапазон.
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!
Похожие книги на "Программирование на языке Ruby"
Книги похожие на "Программирование на языке Ruby" читать онлайн или скачать бесплатно полные версии.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Отзывы о "Хэл Фултон - Программирование на языке Ruby"
Отзывы читателей о книге "Программирование на языке Ruby", комментарии и мнения людей о произведении.