Ruby поддерживает целые числа и числа с плавающей запятой (float numbers). Целые числа могут быть любого порядка (на самом деле они ограничены сверху объемом памяти, выделенным вашей операционной системой). Целые числа внутри диапазона (-2^30, 2^30 — 1) или (-2^62, 2^62 -1) хранятся в двоичной форме и представляют собой экземпляры класса Fixnum. Целые вне этих диапазонов хранятся как экземпляры класса Bignum (в данный момент класс представляет собой множество переменной длины, элементы которого это экземпляры класса Fixnum). Эта разница прозрачна для пользователя и Ruby автоматически конвертирует классы в обе стороны.
даст
Чтобы записать целочисленный литерал вы по желанию используете знак ( "+" или "-" ), необязательный индикатор обозначающий в какой форме записать число (см. пример: 0 для восьмеричной, 0d для десятичной — применяется по умолчанию, 0x для шестнадцатеричной или 0b для двоичной), затем пишете строку состоящую из цифр. Знаки подчеркивания игнорируются в этой строке, и некоторые ребята используют их вместо запятой в боольших числах.
Можно генерировать контрольные символы (перевод каретки, например) используя форму ?\C-x и ?\cx. Метасимволы (x | 0x80) можно генерировать используя ?\M-x. Их комбинация генерируется используя ?\M-\C-x. Номер обратного слеша можно получить используя запись ?\\.
Численный литерал с десятичной точкой и/или экспонентой соответствует объекту класса Float, который в свою очередь соответствует нативному типу double операционной системы. После точки обязательно должна стоять цифра, например, если вы запишите число 1.0e3 в форме 1.e3, Ruby попытается вызвать метод e3 класса Fixnum.
Все числа — объекты и отвечают на большое количество сообщений. В этом есть отличие от, например, C++: модуль числа нужно находить способом num.abs, а не abs(num).
Целые числа поддерживают некоторые полезные итераторы. Их названия говорят сами за себя: 6.times вызвает ассоциированный с ним блок кода 6 раз, upto и downto нужны чтобы установить верхнюю или соответственно нижнюю границу для количества вызовов блока кода. Класс Numeric предоставляет обобщенный метод step, более похожий на всем привычный for.
даст
Наконец, нужно предупредить программистов на Perl (и некоторых других тоже — прим. перев.): строки, содержащие цифры не конвертируются автоматически в числа. Это может подвести вас, если вы читаете числа из файла. Например, мы хотим найти сумму цифр на каждой строке, из файла:
Следующий код даст неожиданный для кого-то результат:
даст нам
Проблема в том, что v1 и v2 содержат ссылки на строковые объекты. Для них результатом выполнения операции сложения будет конкатенация двух строк. Чтобы добиться желаемого результата, используйте метод Integer, чтобы привести строку к целому числу.
наконец то дает нам:
Ура!
Перевод книги Dave Thomas — Programming Ruby.
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.