Ruby Числа

Posted on Апрель 29, 2008. Filed under: ruby | Метки: , |

Ruby поддерживает целые числа и числа с плавающей запятой (float numbers). Целые числа могут быть любого порядка (на самом деле они ограничены сверху объемом памяти, выделенным вашей операционной системой). Целые числа внутри диапазона (-2^30, 2^30 — 1) или (-2^62, 2^62 -1) хранятся в двоичной форме и представляют собой экземпляры класса Fixnum. Целые вне этих диапазонов хранятся как экземпляры класса Bignum (в данный момент класс представляет собой множество переменной длины, элементы которого это экземпляры класса Fixnum). Эта разница прозрачна для пользователя и 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

Реклама

Make a Comment

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Liked it here?
Why not try sites on the blogroll...

%d такие блоггеры, как: