num = 81
6.times do
puts "#{num.class}: #{num}"
num *= num
end
даст
Fixnum: 81
Fixnum: 6561
Fixnum: 43046721
Bignum: 1853020188851841
Bignum: 3433683820292512484657849089281
Bignum: 11790184577738583171520872861412518665678211592275841109096961
Чтобы записать целочисленный литерал вы по желанию используете знак ( "+" или "-" ), необязательный индикатор обозначающий в какой форме записать число (см. пример: 0 для восьмеричной, 0d для десятичной — применяется по умолчанию, 0x для шестнадцатеричной или 0b для двоичной), затем пишете строку состоящую из цифр. Знаки подчеркивания игнорируются в этой строке, и некоторые ребята используют их вместо запятой в боольших числах.
123456 => 123456 # Fixnum
0d123456 => 123456 # Fixnum
123_456 => 123456 # Fixnum знаки подчеркивания игнорируются
-543 => 543 # Fixnum отрицательное число
0xaabb => 43707 # Fixnum шестнадцатеричная форма
0377 => 255 # Fixnum восьмеричная форма
0b10_1010 => 42 # Fixnum двоичная форма со знаком минус
123_456_789_123_456_789 => 123456789123456789 # Bignum
Можно генерировать контрольные символы (перевод каретки, например) используя форму ?\C-x и ?\cx. Метасимволы (x | 0x80) можно генерировать используя ?\M-x. Их комбинация генерируется используя ?\M-\C-x. Номер обратного слеша можно получить используя запись ?\\.
?a => 97 # ASCII символ
?\n => 10 # код для новой строки (0x0a)
?\C-a => 1 # CTRL a = ?A & 0x9f = 0x01
?\M-a => 225 # meta sets bit 7
?\M-\C-a => 129 # meta and control a
?\C-? => 127 # удалить символ
Численный литерал с десятичной точкой и/или экспонентой соответствует объекту класса Float, который в свою очередь соответствует нативному типу double операционной системы. После точки обязательно должна стоять цифра, например, если вы запишите число 1.0e3 в форме 1.e3, Ruby попытается вызвать метод e3 класса Fixnum.
Все числа — объекты и отвечают на большое количество сообщений. В этом есть отличие от, например, C++: модуль числа нужно находить способом num.abs, а не abs(num).
Целые числа поддерживают некоторые полезные итераторы. Их названия говорят сами за себя: 6.times вызвает ассоциированный с ним блок кода 6 раз, upto и downto нужны чтобы установить верхнюю или соответственно нижнюю границу для количества вызовов блока кода. Класс Numeric предоставляет обобщенный метод step, более похожий на всем привычный for.
3.times { print «X » }
1.upto(5) {|i| print i, " " }
99.downto(95) {|i| print i, " " }
50.step(80, 5) {|i| print i, " " }
даст
X X X 1 2 3 4 5 99 98 97 96 95 50 55 60 65 70 75 80
Наконец, нужно предупредить программистов на Perl (и некоторых других тоже — прим. перев.): строки, содержащие цифры не конвертируются автоматически в числа. Это может подвести вас, если вы читаете числа из файла. Например, мы хотим найти сумму цифр на каждой строке, из файла:
3 4
5 6
7 8
Следующий код даст неожиданный для кого-то результат:
some_file.each do |line|
v1, v2 = line.split #разбить строку на объекты между пробелами
print v1 + v2, " "
end
даст нам
34 56 78
Проблема в том, что v1 и v2 содержат ссылки на строковые объекты. Для них результатом выполнения операции сложения будет конкатенация двух строк. Чтобы добиться желаемого результата, используйте метод Integer, чтобы привести строку к целому числу.
some_file.each do |line|
v1, v2 = line.split #разбить строку на объекты между пробелами
print Integer(v1) + Integer(v2), " "
end
наконец то дает нам:
7 11 15
Ура!
Перевод книги Dave Thomas — Programming Ruby.

