Sonlar — Ruby’da ikkita asosiy klass orqali ifodalanadi: Integer (butun son) va Float (kasr son). Ikkalasi ham Numeric klassidan meros oladi va sonlar ustidagi barcha amallarni obyekt metodlari sifatida taqdim etadi.
Integer / Float —
Integer— chegarasiz aniqlikdagi butun son klassi (xotira yetganicha kattalasha oladi, to’lib ketish — overflow — bo’lmaydi).Float— IEEE 754 standartidagi qo’sh aniqlikdagi kasr son klassi.
Butun va kasr sonlar
Ikkala klass ham arifmetik amallarni qo’llab-quvvatlaydi, lekin natija turi operandlarga bog’liq:
butun = 7 / 2
kasr = 7.0 / 2
puts butun
puts kasr
puts butun.class
puts kasr.class
3
3.5
Integer
Float
7 / 2 — ikkala operand ham Integer bo’lgani uchun natija butunlashtiriladi (3). 7.0 / 2 da esa kamida bitta operand Float bo’lgani uchun natija aniq kasr (3.5) bo’ladi. Bu — Ruby’dagi eng ko’p uchraydigan nozik farqlardan biri.
Chegarasiz aniqlik
Ruby’ning Integer klassi C++’dagi int yoki Java’dagi int/longdan farqli o’laroq, qat’iy chegaraga ega emas — son xotira yetganicha o’sishi mumkin:
katta_son = 2**100
puts katta_son
puts katta_son.class
1267650600228229401496703205376
Integer
100-darajaga ko’tarilgan 2 odatiy 64-bitli butun sonning chegarasidan (2**63-1) ancha oshib ketadi, lekin Ruby buni xatosiz, to’liq aniqlikda hisoblaydi. Bu Ruby’ni katta sonlar bilan ishlashda (masalan, kriptografiya yoki kombinatorika masalalarida) ishonchli qiladi.
Foydali son metodlari
Sonlar ham obyekt bo’lgani uchun ularda amaliy metodlar bor:
puts (-15).abs
puts 17.even?
puts 17.odd?
puts 4.5.round
puts 4.5.ceil
puts 4.5.floor
15
false
true
5
5
4
abs — modul, even?/odd? — juft/toqlikni tekshiradi (natija Boolean), round/ceil/floor — kasr sonni yaxlitlash, tomonga qarab oshirish yoki kamaytirish. So’roq belgisi (?) bilan tugagan metod nomlari Ruby konvensiyasi bo’yicha har doim true/false qaytaradi.
Qoldiq va daraja
Qoldiqni topish va darajaga ko’tarish amaliyotda tez-tez kerak bo’ladi:
puts 17 % 5
puts 2**10
puts 10.gcd(4)
2
1024
2
% — bo’lishdan qolgan qoldiq (masalan, son juft/toqligini yoki davriylikni tekshirishda), 2**10 dagi daraja operatori sonni ko’rsatilgan darajaga ko’taradi, gcd — ikkita sonning eng katta umumiy bo’luvchisi. Oxirgisi Ruby standart kutubxonasining sonlar bilan qanchalik boy ishlashini ko’rsatadi.