Цілі числа в 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.