str = ("Первая " + 'вторая').center(20) # дают одно и то же.
• В Ruby есть несколько псевдопеременных, которые выглядят как локальные переменные, но применяются для особых целей. Это self
nil
, true
, false
, __FILE__
и __LINE__
.1.5.2. Перспективы программирования
Наверное, каждый, кто знает Ruby (сегодня), в прошлом изучал или пользовался другими языками. Это, с одной стороны, облегчает изучение Ruby, так как многие средства похожи на аналогичные средства в других языках. С другой стороны, у программиста может возникнуть ложное чувство уверенности при взгляде на знакомые конструкции Ruby. Он может прийти к неверным выводам, основанным на прошлом опыте; можно назвать это явление «багажом эксперта».
Немало специалистов переходит на Ruby со Smalltalk, Perl, C/C++ и других языков. Ожидания этих людей сильно различаются, но так или иначе присутствуют. Поэтому рассмотрим некоторые вещи, на которых многие спотыкаются.
• Символ в Ruby представляется целым числом. Это не самостоятельный тип, как в Pascal, и не эквивалент строки длиной 1. В ближайшем будущем положение изменится и символьная константа станет строкой, но на момент написания данной книги этого еще не произошло. Рассмотрим следующий фрагмент:
x = "Hello"
y = ?А
puts "x[0] = #{x[0]}" # Печатается x[0] = 72
puts "y = #{y}" # Печатается y = 65
if y == "А" # Печатается no
puts "yes"
else
puts "no"
end
• He существует булевского типа. TrueClass
FalseClass
— это два разных класса, а единственными их экземплярами являются объекты true
и false
.• Многие операторы в Ruby напоминают операторы в языке С. Два заметных исключения — операторы инкремента и декремента (++
--
). Их в Ruby нет ни в «пост», ни в «пред» форме.• Известно, что в разных языках оператор деления по модулю работает по-разному для отрицательных чисел. Не вдаваясь в споры о том, что правильно, проиллюстрируем поведение в Ruby:
puts (5 % 3) # Печатается 2
puts (-5 % 3) # Печатается 1
puts (5 % -3) # Печатается -1
puts (-5 % -3) # Печатается -2
• Некоторые привыкли думать, что «ложь» можно представлять нулем, пустой строкой, нулевым символом и т.п. Но в Ruby все это равно «истине». На самом деле истиной будет все кроме объектов false
nil
.• В 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 # Операции && выполняются первыми.