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.