Comprendere i Tipi di Dati in Ruby


Quando scrivi programmi, utilizzi tipi di dati per classificare i dati. I tipi di dati dicono al computer come gestire i dati nel tuo programma. Determinano anche cosa puoi fare con i dati, incluso quali operazioni puoi eseguire.

Un modo per pensare ai tipi di dati è considerare i diversi tipi di dati che usiamo nel mondo reale. Ad esempio, utilizziamo numeri interi (0, 1, 2, …), numeri interi (…, -1, 0, 1, …), e numeri irrazionali (π).

Di solito, in matematica, possiamo combinare numeri di diversi tipi e ottenere qualche tipo di risposta. Ad esempio, potremmo voler aggiungere 5 a π:

5 + π

Possiamo mantenere l’equazione come risposta per tener conto del numero irrazionale, oppure possiamo arrotondare π a un numero con un breve numero di cifre decimali e quindi aggiungere i numeri insieme:

5 + π = 5 + 3.14 = 8.14

Ma se proviamo a valutare numeri con un altro tipo di dato, come le parole, le cose cominciano a avere meno senso. Come risolveremmo l’equazione seguente?

sky + 8

Questo non è qualcosa che sappiamo immediatamente come risolvere. Il computer non può farlo neanche perché i dati sono di due tipi diversi. “Cielo” è una parola e 8 è un numero intero. Quando scriviamo programmi, dobbiamo fare attenzione a come assegniamo i valori e come li manipoliamo tramite operazioni come l’addizione, la sottrazione, la moltiplicazione e altre ancora.

In questo tutorial, imparerai i tipi di dati più importanti nativi di Ruby: interi, float, stringhe, simboli, array e hash. Questa non è un’indagine esaustiva sui tipi di dati, ma ti aiuterà a familiarizzare con le opzioni disponibili nei tuoi programmi.

Esplorerai quindi la tipizzazione dinamica. I programmi Ruby determinano i tipi di dati in base a ciò che le variabili contengono, quindi comprendere come funziona la tipizzazione dinamica ti aiuterà ad evitare situazioni complesse nei tuoi programmi. E poiché le variabili possono contenere qualsiasi valore, imparerai a identificare il tipo di dati di una variabile.

Cominciamo guardando come lavorare con numeri interi in Ruby.

Interi

Come in matematica, gli interi nella programmazione informatica sono numeri interi che possono essere positivi, negativi o 0 (…, -1, 0, 1, …). Un intero è anche comunemente noto come un int.

Puoi stampare un intero in questo modo:

print -25
Output
-25

Puoi anche memorizzare l’intero in una variabile e quindi stampare il valore facendo riferimento alla variabile:

my_int = -25
print my_int
Output
-25

Puoi anche fare calcoli con gli interi. Ad esempio, puoi calcolare la somma di due numeri e stampare il risultato:

sum = 116 - 68
print sum
Output
48

Quando scriviamo numeri più grandi, tendiamo ad usare le virgole per renderli più leggibili. Ad esempio, scriveremmo 1,000,000 per “un milione”. Non puoi usare le virgole nel tuo codice, ma Ruby ti permette di usare il carattere di sottolineatura (_) per rendere i numeri grandi più leggibili.

Provalo:

large_number.rb
large_number = 1_234_567
print large_number

Vedrai che l’intero verrà stampato senza le sottolineature:

Output
1234567

Le sottolineature ti permettono di scrivere codice più leggibile se devi rappresentare numeri grandi nei tuoi programmi.

Man mano che impari di più sul linguaggio Ruby, avrai molte più opportunità di lavorare con gli interi. Vediamo come lavorare con i numeri reali.

Numeri in Virgola Mobile

A floating-point number or a float represents a real number. Real numbers can be either a rational or an irrational number; numbers that contain a fractional part, such as 9.0 or -116.42. In other words, a float in a Ruby program is a number that contains a decimal point.

Puoi stampare i numeri float in Ruby proprio come stampi gli interi:

print 17.3
Output
17.3

Puoi anche dichiarare una variabile e assegnare un float:

my_float = 17.3
print my_float
Output
17.3

E, proprio come con gli interi, puoi fare operazioni matematiche con i float in Ruby, anche:

sum = 564.0 + 365.24
print sum
Output
929.24

Se aggiungi un float a un intero in Ruby, otterrai un float:

sum = 564 + 365.24
print sum
Output
929.24

Ruby considererà qualsiasi numero scritto senza decimali come un intero (come in 138) e qualsiasi numero scritto con decimali come un float (come in 138.0).

Successivamente, vediamo i booleani in Ruby.

Tipi di dati booleani

I booleani sono utilizzati per rappresentare i valori di verità associati al ramo logico della matematica, che informa gli algoritmi nell’informatica. In Ruby, rappresentiamo questo tipo di dati con uno dei due valori, sia true che false.

Molte operazioni in matematica ci forniscono risposte che si valutano come vero o falso:

  • maggiore di
  • 500 > 100 true
  • 1 > 5 false
  • minore di
  • 200 < 400 true
  • 4 < 2 false
  • uguale
  • 5 = 5 true
  • 500 = 400 false

Come per i numeri, è possibile memorizzare un valore true o false in una variabile:

result = 5 > 8

È quindi possibile stampare il valore booleano con una chiamata alla funzione print():

print result

Dato che 5 non è maggiore di 8, vedrai il seguente risultato:

Output
false

Scrivendo più programmi in Ruby, diventerai sempre più familiare con il funzionamento dei booleani e con il modo in cui diverse funzioni e operazioni che si valutano come true o false possono cambiare il corso del programma.

Successivamente, esploriamo come lavorare con il testo nei nostri programmi.

Stringhe

A string is a sequence of one or more characters, such as letters, numbers, and symbols. Strings primarily exist within either single quotes (') or double quotes (") in Ruby, so to create a string, enclose a sequence of characters in quotes, like this:

"This is a string in double quotes."

Il piccolo programma “Ciao, mondo!” dimostra come una stringa possa essere utilizzata nella programmazione informatica, poiché i caratteri che compongono la frase Ciao, mondo! formano una stringa.

print "Hello, World!"

Come con altri tipi di dati, è possibile memorizzare le stringhe nelle variabili:

output = "Hello, World!"

E stampare la stringa chiamando la variabile:

print output
Output
Hello, World!

Come i numeri, ci sono molte operazioni che possiamo eseguire sulle stringhe all’interno dei nostri programmi per manipolarle al fine di ottenere i risultati desiderati. Le stringhe sono importanti per comunicare informazioni all’utente e per consentire all’utente di comunicare informazioni al programma.

A volte è necessario lavorare con elenchi di dati. Ecco dove entrano in gioco gli array.

Array

Un array può contenere più valori all’interno di una singola variabile. Ciò significa che è possibile contenere un elenco di valori all’interno di un array e iterare attraverso di essi. Ogni elemento o valore che si trova all’interno di un array è chiamato un elemento.

Gli array sono definiti specificando i valori tra parentesi quadre [ ], separati da virgole.

Un array di interi appare così:

[-3, -2, -1, 0, 1, 2, 3]

A array of floats looks like this:

[3.14, 9.23, 111.11, 312.12, 1.05]

Ecco una lista di stringhe:

['shark', 'cuttlefish', 'squid', 'mantis shrimp']

Come altri tipi di dati, puoi assegnare un array a una variabile:

sea_creatures = ['shark', 'cuttlefish', 'squid', 'mantis shrimp']

Se stampiamo la variabile, l’output sarà esattamente come l’array che abbiamo creato:

print sea_creatures
['shark', 'cuttlefish', 'squid', 'mantis shrimp']

Puoi accedere agli elementi individuali in un array usando un numero di indice, partendo da 0.

puts sea_creatures[0] # squalo
puts sea_creatures[2] # calamaro

Per stampare l’ultimo valore, puoi usare l’indice -1. Ruby fornisce anche i metodi .first e .last per ottenere rispettivamente il primo e l’ultimo elemento:

puts sea_creatures.first # squalo
puts sea_creatures.last # gambero mantide

Gli array in Ruby possono contenere molti tipi di dati diversi. Puoi memorizzare stringhe, simboli e persino altri array in un array:

record = [
:en,
"Sammy",
42,
[
"coral",
"reef"
]
]

Gli array in Ruby sono mutabili, il che significa che puoi aggiungere valori, rimuovere valori e persino modificare voci nell’array.

A volte abbiamo bisogno di un modo per etichettare le cose in un programma. A questo servono i simboli.

Simboli

A symbol is a special data type that acts like a label or an identifier in a Ruby program. Symbols are immutable, which means that they cannot be changed. A symbol looks like a variable declaration without a value. Here’s an example of a symbol:

:time_zone

In Ruby, si usa tipicamente un simbolo per identificare qualcosa di importante, mentre si utilizza una stringa per il testo con cui è necessario lavorare o manipolare. Ogni stringa in un programma Ruby è un proprio oggetto, con una posizione unica nella memoria, anche se le stringhe sono identiche.

Ma se si fa riferimento allo stesso simbolo più volte, si fa riferimento allo stesso oggetto ovunque nel programma, il che significa che si fa riferimento alla stessa posizione di memoria.

Vedrai questo concetto in azione mentre esaminiamo gli hash, che ti consentono di associare chiavi a valori.

Hashes

A hash is a dictionary-like collection of keys and values. These key-value pairs provide a useful way to store and access data. Hashes are often used to hold data that are related, such as the information about a user. You define a hash like this:

{"first_name" => "Sammy", "last_name" => "Shark"}

Puoi assegnare hash a variabili proprio come altri tipi di dati:

user = {"first_name" => "Sammy", "last_name" => "Shark"}

Per recuperare i valori dall’hash user, si utilizza la chiave per il valore:

print user["first_name"] # "Sammy"
print user["last_name"] # "Shark"

Puoi utilizzare simboli come chiavi nell’hash invece di stringhe:

user = {:first_name => "Sammy", :last_name => "Shark"}

Usare simboli come chiavi di hash è preferibile quando possibile. Ogni istanza di un simbolo punta allo stesso oggetto, mentre ogni istanza di una stringa si riferisce a un oggetto unico. Utilizzare simboli come chiavi comporta prestazioni leggermente migliori e un uso ridotto della memoria.

Quando si utilizzano simboli come chiavi, si utilizzano simboli per recuperare i valori:

print user[:first_name] # "Sammy"
print user[:last_name] # "Shark"

Puoi anche utilizzare una sintassi leggermente diversa quando si definisce l’hash:

user = {first_name: "Sammy", last_name: "Shark"}

Questa sintassi è simile a quella utilizzata in JavaScript e in altri linguaggi. Questa sintassi definisce le chiavi come Simboli, quindi accederesti agli elementi utilizzando :first_name e :last_name invece delle stringhe "first_name" e "last_name".

Hai esaminato diversi tipi di dati, vediamo ora come Ruby lavora con questi tipi.

Tipizzazione dinamica

In Ruby, non dichiari esplicitamente un tipo di dato prima di assegnare un valore; l’assegnazione del valore determina il tipo di dato. Ruby utilizza tipizzazione dinamica, il che significa che il controllo del tipo viene eseguito durante l’esecuzione anziché durante la compilazione, come nei linguaggi che utilizzano tipizzazione statica. Ruby determina il tipo di dato dai dati memorizzati nella variabile. Questo è simile ai tipi di dati in Python e ai tipi di dati in JavaScript.

La variabile t nell’esempio seguente può essere impostata su qualsiasi tipo di dato disponibile:

t = 42 # t is an Integer
t = "Sammy" # t is a String
t = :sammy # t is a Symbol
t = true # t is a boolean (true)
t # t is nil

Con linguaggi a tipizzazione dinamica, puoi riutilizzare una variabile esistente per contenere tipi di dati diversi.

Questo è utile quando si convertono dati da un tipo a un altro. Ad esempio, potresti avere questo codice che chiede all’utente un valore numerico:

print "Please enter the length of the room: "
length = gets.chop

I dati che ottieni dalla tastiera sono sempre una stringa, quindi per fare operazioni matematiche, devi convertire i dati della variabile length in un numero. Nei linguaggi a tipizzazione statica, dove devi dichiarare il tipo di dati della variabile prima di poterle assegnare un valore, avresti bisogno di una nuova variabile per contenere i dati convertiti. Ma in Ruby, poiché è a tipizzazione dinamica, puoi riutilizzare la variabile length se lo desideri.

# Converti l'importo in un float.
length = length.to_f

Il metodo to_f converte la stringa in un float. Ruby fornisce anche il metodo to_i per convertire le stringhe in interi, e la maggior parte degli oggetti può essere convertita in stringhe usando il metodo to_s:

42.to_s # "42"
(42.5).to_s # "42.5"
["Sammy", "Shark"].to_s # "[\"Sammy\", \"Shark\"]"

Ruby è a tipizzazione dinamica, ma non ti consente di eseguire operazioni su diversi tipi di dati senza convertirli nello stesso tipo. Ad esempio, questo codice genererà un errore:

print 5 + "5"
Output
TypeError: String can't be coerced into Integer

Come anche questo codice:

print "5" + 5
Output
TypeError: no implicit conversion of Integer into String

Se vuoi sommare i numeri per ottenere 10, converti la stringa in un intero. Se vuoi concatenarli per ottenere "55", converti l’intero in una stringa.

La tipizzazione dinamica offre flessibilità, ma uno svantaggio è che non puoi sempre essere sicuro di che tipo di dati stai lavorando, poiché la variabile può contenere qualsiasi tipo disponibile. Ruby fornisce modi per identificare il tipo di dati.

Identificazione dei Tipi di Dati

In Ruby, quasi tutto è un oggetto. Integer, float, array, symbol e hash sono tutti oggetti Ruby, e tutti hanno un metodo chiamato class che ti dirà di che tipo sono. Anche i booleani true e false, e il valore nil sono oggetti. Provalo tu stesso:

42.class # Integer
(42.2).class # Float
["Sammy", "Shark"].class # Array
true.class # TrueClass
nil.class # NilClass

Inoltre, puoi utilizzare il metodo kind_of? per verificare un certo tipo di dato, come questo:

42.kind_of?(Integer) # true

Questo è particolarmente utile quando hai una variabile e vuoi determinarne il tipo:

# da qualche parte nel codice...
sharks = ["Hammerhead", "Tiger", "Great White"]
...
# altrove...

sharks.kind_of?(Hash) # false
sharks.kind_of?(Array) # true

Puoi anche usarlo per verificare che i dati provenienti da una fonte esterna siano corretti:

if data.kind_of? String
data = data.to_f
end

Ruby fornisce anche il metodo is_a?, che fa la stessa cosa di kind_of? ma potrebbe essere un po’ più facile da leggere per alcuni sviluppatori:

if data.is_a? String
data = data.to_f
end

Utilizzare class, kind_of? e is_a? può aiutarti a garantire di lavorare con il tipo di dati corretto. Man mano che impari di più su Ruby, scoprirai altri modi per gestire i dati che non comportano il controllo esplicito del tipo di dati.

Conclusioni

Userai molti tipi di dati diversi nei tuoi programmi Ruby. Ora hai una migliore comprensione dei principali tipi di dati disponibili nei programmi Ruby.

Dai un’occhiata a questi tutorial per continuare la tua esplorazione dei tipi di dati di Ruby:

Source:
https://www.digitalocean.com/community/tutorials/understanding-data-types-in-ruby