Iniziamo a vedere i tipi fondamentali di ogni linguaggio: i numeri e le stringhe. Queste ultime le analizzeremo nella prossima lezione.
Il linguaggio Ruby prevede l'esistenza di numeri interi e di numeri a virgola mobile (floating-point). I primi sono oggetti delle classi Fixnum
o Bignum
mentre i secondi sono di tipo Float
. I numeri che possono essere rappresentati in una word (meno un bit) sono oggetti della classe Fixnum, quelli che vanno oltre questo limite sono invece istanze della classe Bignum:
f = 123 f.class => Fixnum b = 1234567890 b.class => Bignum
Per rappresentare numeri non decimali va fatto precedere al numero vero e proprio un indicatore di base (0b per i binari, 0 per gli ottali, 0d per i decimali e 0x per gli esadecimali), ad esempio:
> 10 # i numeri decimali sono preceduti da 0d che però può essere omesso => 10 > 010 # i numeri ottali sono preceduti da uno 0 => 8 > 0x10 # i numeri esadecimali sono preceduti da 0x => 16 > 0b10 # i numeri binari sono preceduti da 0b => 2
Essendo i numeri oggetti di una determinata classe possiamo applicare ad essi i metodi previsti dalle rispettive classi. I principali metodi previsti da Fixnum e Bignum sono:
- operazioni aritmetiche di base (+, -, *, /, div, %, modulo, **, - unario)
- operazioni sui bit (~, |, &, ^, <<, >>)
- altre operazioni aritmetiche:
- valore assoluto (abs):
-123.abs -> 123
- dimensione in byte (size):
100.size -> 4
- operazioni di conversione (to_f, to_s, to_sym):
1.to_s -> "1"
,1.to_f -> 1.0
- valore assoluto (abs):
Altri metodi sono ereditati dalle classi Integer
e Numeric
poiché entrambe le classi derivano da Integer che a sua volta deriva da Numeric. Abbiamo ad esempio chr
, floor
, next
, to_i
, step
e molti altri.
La classe Float oltre ai metodi base visti per Fixnum e a quelli ereditati da Numeric prevede tra l'altro:
infinite?
che restituisce -1, +1 o nil a seconda che il valore sia pari a meno infinito, più infinito o un numero finito:(1.0).infinite? -> nil
,(+1.0/0.0).infinite? -> 1
nan?
restituisce true se il valore è un numero non valido secondo gli standard IEEE.
Per ulteriori dettagli su questi e altri metodi consiglio vivamente l'uso di ri
sulle classi Fixnum, Bignum, Integer e Numeric.