Imparare il Ruby - Capitolo 1: I principi fondamentali
September 7, 2007
Capitolo 1 - I principi fondamentali
A proposito di questo capitolo
- 1.1 Primi passi
- 1.2 Le stringhe
- 1.3 Nuovi nomi per vecchie cose
- 1.4 Le variabili
- 1.5 Il nostro primo programma
- 1.6 Come scrivere ottimi programmi
- INDICE DEL DOCUMENTO PRINCIPALE
A proposito di questo capitolo:
Questo capitolo racchiude i principi fondamentali per la corretta stesura di un programma. La conoscenza di tale capitolo è richiesta da chiunque aspiri a programmare in ruby.
1.1 - Primi Passi
* Ruby Interattivo
Inizieremo la nostra esplorazione del Ruby attraverso “irb”, la shell interattiva di Ruby, aprendo il terminale del nostro sistema e digitando: irb –simple-prompt
* Ruby come Calcolatore
Per iniziare a comprendere Ruby, possiamo iniziare ad utilizzarlo come una semplice calcolatrice e iniziare a prendere confidenza con gli operatori aritmetici.
(+) Addizione, (-) Sottrazione, (*) Moltiplicazione, (/) Divisione.
Proviamo attraverso la Shell Interattiva:
irb –simple-prompt
>> 1+2
=> 3
>> 4-3
=>1
>> exit
Come avrete sicuramente notato, la shell interattiva ci permette di eseguire immediatamente il calcolo richiesto a ruby. Per uscire dalla shell interattiva è stato necessario digitare exit.
Potete continuare a giocare con la shell interattiva provando questo:
>> 3*2
=> 6
>> 4/2
=> 2
>> 3-5
=> -2
>> 3/2
=> 1
Prestate attenzione a cosa accade quando provate a dividere 3/2. Il valore restituito è 1, questo perchè Ruby riconosce due classi di numeri: Integers (numeri interi), Float (numeri decimali).
* I numeri in Ruby
Integers - Un integer è un numero intero come 1, 2, -5, etc. Quando si opera utilizzando numeri interi, Ruby restituirà il valore come numero intero, infatti 3/2 dovrebbe essere uguale a 1.5, ma dovendo restituire un numero intero Ruby restituirà 1.
Floats - Un float è un numero decimale come 3.14, 1.5, 3.0, etc. (E’ opportuno notare che a differenza della notazione decimale italiana che viene indicata utilizzando la virgola, nei linguaggi di programmazione viene sostituita dal punto). Seguendo lo stesso concetto per i numeri interi, se operiamo con numeri decimali, Ruby restituirà un valore decimale, pertanto se rieseguiamo il calcolo riportando la notazione decimale 3.0/2.0, Ruby restituirà 1.5.
Tale caratteristica di Ruby facilita di molto la programmazione e da la possibilità di scrivere in maniera più immediata un programma. Approfondendo i vari capitoli riuscirete a comprenderne il motivo.
* Altri Operatori in Ruby
Prima di concludere questo capitoletto, diamo uno sguardo ad altri due operatori utilizzati in Ruby: (**) potenza, (%) resto.
Proviamoli:
irb –simple-prompt
>> 3 ** 2
=> 9
>> 5 % 2
=> 1
>> 5.1 % 2
=> 1.1
Notiamo come si è comportato Ruby utilizzando l’operatore di resto (%) con i numeri decimali. In questo esempio 2 sta due volte in 5.1 con un resto di 1.1.
* Numeri Molto Grandi e Numeri Molto Piccoli
Ruby risulta ottimo a negoziare con i numeri molto grandi e molto piccoli. Supponiamo di voler salvare all’interno di una variabile il numero: 192349562563447.
Come potrete notare, il numero risulta difficile da legger. Nella notazione numerica Italiana potremmo dividere le cifre utilizzando il punto (.) e pertanto: 192.349.562.563.447 . Ruby utilizza qualcosa di simile attraverso il carattere underscore ( _ ) :
irb –simple-prompt
>> numero = 192_349_562_563_447
=> 192349562563447
E se volessimo scrivere 17_000_000_000_000_000_000 oppure 0.000_000_000_000_321? Normalmente vorresti utilizzare una notazione scientifica per scrivere 1.7 x 1019 e 3.21 x 10-13. Ancora una volta Ruby ci propone un’ottima alternativa:
irb –simple-prompt
>> numerogrande = 1.7e19
=> 1.7e+19
>> numeropiccolo = 3.21e-13
=> 3.21e-13
Nota: Il carattere “e” sta per “esponente” in una notazione scientifica. Per esempio 1.7e19 significa 1.7 x 1019, 3.21e-13 significa 3.21 x 10-13.
* Esiste un numero troppo grande per Ruby?
Non ci sono numeri troppo grandi per Ruby, ma sicuramente esistono numeri così grandi che il computer non riesce ad elaborare.
Tempo fa, un matematico chiamato Edward Kasner chiese al suo nipote di 9 anni, Milton Sirotta, di dare un nome ad un numero veramente grande. Il ragazzo si fermò per un momento e poi disse… googol!. Un googol è 10100 (questo è 1 seguito da 100 zeri).
Puoi rappresentare un googol in Ruby? Prova digitandolo nella Shell Interattiva:
googol = 10**100
Tempo dopo, il dottor Kasner diede il nome ad un numero ancora più grande, un googolplex. Un googolplex è 1 seguito da zeri googol. In altre parole, esso è 10googol o 1010100.
Puoi rappresentare un googolplex in Ruby? Prova digitandolo nella Shell Interattiva completando il codice precedente:
googolplex = 10**googol
La parola usata per un gruppo di caratteri è Stringa. Qui un esempio di qualche stringa:
- “Ciao!”
- “Ruby Rulla.”
- “Il 5 è il mio numero preferito. Quale il tuo?”
- “Snoopy dice #%^?&*@!”
* Alcune cose che si possono fare con le stringhe
Ruby ci lascia fare un po’ di cose carine con le stringhe:
irb –simple-prompt
>> “Hello ” + “World”
=> “Hello World”
>> “hi ” * 3
=> “hi hi hi”
E’ bene ricordare questo esempio “hi ” * 3, in quanto il risultato è identico a “hi ” + “hi ” + “hi “, resituendo così “hi hi hi”.
Notare inoltre cosa accade se dimentichiamo di inserire lo spazio in “hi “:
irb –simple-prompt
>> “hi” * 3
=> “hihihi”
Osservare cosa accade nell’esempio che segue:
irb –simple-prompt
>> “1″ + “2″
=> “12″
>> “1″ * 2
=> “11″
Come si può notare, Ruby interpreta come stringa tutto ciò che rientra dentro le virgolette ( ” “ ) , e quindi anche i numeri vengono trattati come testo e non come numeri reali.
* Altre operazioni con il testo
Qui viene mostrato cos’altro ancora è possibile ottenere sul testo con Ruby:
irb –simple-prompt
>> “hello”.capitalize
=> “Hello”
>> “hello”.reverse
=> “olleh”
>> “hello”.next
=> “hellp”
>> “hello”.upcase
=> “HELLO”
>> “HELLO”.downcase
=> “hello”
>> “HellO”.swapcase
=> “hELLo”
1.3 - Nuovi nomi per vecchie cose
Ruby utilizza nomi speciali per cose che già conosciamo. Per esempio utilizza la parola Float per dire “decimali”. Di seguito vedremo maggiori definizioni:
- Oggetto: è un contenitore di dati come ad esempio il numero 3 o la stringa “hello”.
- Classe: Ruby separa qualunque cosa in classi (o categorie), come ad esempio Integer, Float e String.
- Metodo: Rappresenta ciò che è possibile fare con gli oggetti. Pensa ad esso come un “comportamento” dell’oggetto. Per esempio puoi sommare due interi, così l’operazione “+” è un metodo di Integer. Puoi trasformare una stringa in maiuscolo, così “upcase” è un metodo di String.
Abbiamo già visto le tre classi per le cose che già conosciamo ( Notare che le Classi in Ruby iniziano con la lettera maiuscola):
NOMI VECCHI -> CLASSI DI RUBY
- interi -> Integer
- decimali -> Float
- testo -> String
Abbiamo già visto alcuni dei più importanti metodi:
CLASSI DI RUBY -> ALCUNI METODI
- Integer -> + - / * % **
- Float -> + - / * % **
- String -> capitalize, reverse, length, upcase
* Classi vs. Oggetti
Prima di continuare, cerchiamo di essere sicuri di aver compreso la differenza tra Classi e Oggetti. Un Oggetto è un’unità di dati, mentre la Classe è il tipo di dato contenuto nell’Oggetto. Per esempio, 3 e 5 sono numeri differenti. Non sono lo stesso oggetto, ma sono entrambi numeri Interi, così sono entrambi della stessa Classe. Di seguito maggiori esempi:
OGGETTO -> CLASSE
- 2 -> Integer
- -5 -> Integer
- 7.2 -> Float
- 3.14 -> Float
- ‘hello’ -> String
- ‘world’ -> String
* Notazione Class#method
Ricordiamo che differenti Classi hanno differenti metodi. Mostreremo alcune differenze che già abbiamo visto.
- Divisioni (/) non lavorano allo stesso modo con Interi e Decimali
- Addizioni (+) non lavorano allo stesso con Stringhe e Interi
- Le Stringhe possiedono importanti metodi che invece non hanno gli Interi e Decimali. (capitalize, lenght, upcase…)
Per questi motivi utilizzeremo la notazione Class#method per accertarci esattamente del metodo che vogliamo utilizzare. Per esempio, diremo Integer#+ per differenziarlo da Float#+ e String#+. Potremo dire anche che String#upcase esiste mentre Integer#upcase non esiste.
* Conversione tra Classi
Ruby utilizza alcuni metodi per la conversione dei dati da una classe all’altra:
- String#to_i -> Converte i dati da Sting a Integer
- String#to_f -> Converte i dati da String a Float
- Float#to_i -> Converte i dati da Float a Integer
- Float#to_s -> Converte i dati da Float a String
- Integer#to_f -> Converte i dati da Integer a Float
- Integer#to_s -> Converte i dati da Integer a String
Esempi:
irb –simple-prompt
>> 34.to_s
=> “34″
>> “12″.to_i
=> 12
>> “hello”.to_i
=> 0
>> 27.2.to_i
=> 27
>> 3.to_f
=> 3.0
* Cos’è una variabile?
Una variabile è un nome che Ruby associa ad un particolare oggetto. Per esempio: city = “Toronto”
Qui Ruby, associa la stringa “Toronto” con il nome (variabile) city.
Pensa ad esso, come se Ruby crei due tabelle. Una con gli oggetti e una con i relativi nomi. Successivamente immagina di disegnare una freccia che collega city a “Toronto”. Attenzione!!! Le variabili devono iniziare con una lettera minuscola.
* Lavorare con le variabili
Si possono manipolare le variabili in modo esatto con lo stesso sistema con il quale vorreste manipolare l’oggetto che essi rappresentano.
irb –simple-prompt
>> var1 = 7
=> 7
>> var2 = 4
=> 4
>> var3 = var1 + var2
=> 11
>> var4 = “hello”
=> “hello”
>> var4 = var4 * var2
=> “hellohellohellohello”
Le variabili sono ottimamente pensate per tenere traccia delle informazioni in maniera più semplice. Supponiamo di aver dato le seguenti istruzioni:
- Somma 2, 4, 6 e 8 insieme.
- Prendi il risultato e dividilo per 5
- Ottieni il prodotto di 2, 3 e 4
- Prendi la risposta dalla linea 2 e sottrailo da quello che ricevi nella linea 3
Sicuramente potremmo scrivere una lunga espressione per fare ciò. In realtà è molto più facile da scrivere:
irb –simple-prompt
>> num1 = 2 + 4 + 6 + 8
=> 20
>> num1 = num1 / 5
=> 4
>> num2 = 2 * 3 * 4
=> 24
>> num2 = num2 - num1
=> 20
* Scorciatoie
Nell’esempio sopra, abbiamo ricavato le seguenti espressioni: num1 = num1 / 5; num2 = num2 - 1;
Questi tipi di espressioni sono molto comuni, così Ruby offre alcune scorciatoie:
ESEMPIO -> SCORCIATOIA -> DEFINIZIONE
- Esempio: var = var +2 -> Scorciatoia: var += 2 -> Definizione: Somma 2 a var
- Esempio: var = var -3 -> Scorciatoia: var -= 3 -> Definizione: Sottrai 3 a var
- Esempio: var = var* 6 -> Scorciatoia: var *= 6 -> Definizione: Moltiplica var per 6
- Esempio: var = var / 2 -> Scorciatoia: var /= 2 -> Definizione: Dividi var per 2
- Esempio: var = var ** 3 -> Scorciatoia: var **= 3 -> Definizione: Cubo di var
- Esempio: var = var % 4 -> Scorciatoia: var %= 4 -> Definizione: var modulo 4
Così, l’esempio precedente potrebbe essere scritto così:
irb –simple-prompt
>> num1 = 2 + 4 + 6 + 8
=> 20
>> num1 /= 5
=> 4
>> num2 = 2 * 3 * 4
=> 24
>> num2 -= num1
=> 20
* Costanti vs. Variabili
Le costanti sono molto simili alle variabili eccetto che per una differenza. Per una variabile vi è un valore mutevole mentre per una costante viene supposto che il valore rimanga fisso. Se proviamo a cambiare il valore di una costante, Ruby ci restituirà un WARNING.
Nel programma è possibile definire la costante come una variabile, con la differenza che la nostra costante inizierà con una lettera maiuscola.
irb
>> City = “Toronto”
=> “Toronto”
>> City = “Paris”
(irb):2: warning: already initialized constant City
=> “Paris”
>> City
=> “Paris”
Nota: City è una costante, nonostante ciò il suo valore è stato cambiato. Si nota però che essendo appunto una costant, Ruby ci avverte che stiamo effettuando un’operazione impropria.
1.5 - Il nostro primo programma
Congratulazioni! Adesso che sei arrivato così lontano, sei pronto per scrivere programmi.
* Hello World
Apri un qualsiasi editor di testi e inserisci: puts “Hello World” . Successivamente salva il file con il nome: hello.rb ed eseguilo dalla shell con ruby hello.rb .
Il comando puts è così chiamato perchè stampa a schermo un’oggetto, come ad esempio una Stringa.
Un altro esempio di come potremmo inserire nel nostro file hello.rb:
name = “Daniel”
puts “Hello ” + name + “. How are you?”
Avviando il nostro programma da shell con ruby hello.rb, otteniamo:
Hello Daniel. How are you?
Notiamo che la variabile name è una Stringa e quindi è stato possibile sommarla ad altre stringhe, proprio come abbiamo scoperto precedentemente nelle lezioni.
In un esempio precedente abbiamo eseguito del codice tramite la shell interattiva irb:
irb –simple-prompt
>> num1 = 2 + 4 + 6 + 8
=> 20
>> num1 /= 5
=> 4
>> num2 = 2 * 3 * 4
=> 24
>> num2 -= num1
=> 20
Inseriamo il codice in un file prog.rb, salviamolo e avviamolo. Il file apparirà così:
num1 = 2 + 4 + 6 + 8
num1 /= 5
num2 = 2 * 3 * 4
num2 -= num1
puts num2
Digitando ruby prog.rb:
20
Supponiamo di estendere ancora il nostro programma e vogliamo che ci risponda con: “The Answer is 20″. Ovviamente non potremmo scrivere: puts “The Answer is ” + num2, questo perchè come visto precedentemente non è possibile sommare una stringa ad un numero e quindi dobbiamo applicare una coversione tra classi. Abbiamo già visto che ciò è possibile con il metodo Integer#to_s e pertanto il nostro file dovrà contenere il seguente codice:
num1 = 2 + 4 + 6 + 8
num1 /= 5
num2 = 2 * 3 * 4
num2 -= num1
puts “The Answer is ” + num2.to_s
* Rendere i nostri programmi eseguibili
Se vogliamo rendere eseguibili i nostri programmi in Ruby e avviarli come un comune programma di Linux o Unix, dobbiamo innanzitutto conoscere la posizione dell’interprete ruby, e quindi dove lo abbiamo installato. Per fare ciò digitiamo sempre nella shell: wich ruby. Il comando di sistema ci restituirà ad esempio: /usr/bin/ruby. A questo punto non ci resterà altro che inserire tale valore preceduto dai simboli “#!”, all’inizio del file prog.rb:
#!/usr/bin/ruby
num1 = 2 + 4 + 6 + 8
num1 /= 5
num2 = 2 * 3 * 4
num2 -= num1
puts “The Answer is ” + num2.to_s
Ultima cosa necessarià , sarà di concedere i corretti permessi al file prog.rb, perchè come ben sappiamo su sistemi Linux o Unix, è necessario concedere i permessi di esecuzione del file sul sistema tramite il comando chmod +x prog.rb, dove appunto +x significa eseguibile.










Leave a Reply