Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Ruby in 25 minuti
1. Ruby in 25 minuti
Una rapida introduzione al maggico mondo di Ruby
- di Marcello Missiroli (prof.missiroli@gmail.com)
- with a little big help from Peter Marklund (http://marklunds.com)
and Jan Elis
2. Chi sono?
• Insegno Informatica e sistemi da...
troppo tempo.
• Al Corni dall' AS 2007/2008
• Gestisco il sito di Moodle della
scuola
3. Cosa vedremo?
In questa rapida esposizione vedremo
cos'è Ruby, i suoi punti di forza e
perché dovreste impararne tutti un po'
prima di andare a lavorare nel campo.
In particolare mi concentrerò un ciò
che rende distingue Ruby dagli
altri linguaggi di programmazione
in modo radicale
5. Tappe
fondamentali dei
linguaggi
• Anni '40: Linguaggio macchina codificato, Assembly
• Anni '50: FORTRAN / COBOL (Compilazione/ General Purpose)
• Anni '60: BASIC / LOGO (Linguaggi interpretati)
• Anni '70: PASCAL / C (Controllo sintattico/Efficienza)
• Anni '80: Smalltalk/C++(Object Oriented programming)
• Anni '90: Java/Javascript e Perl (Bytecode e garbage
collection/Scripting)
6. Diffusione dei linguaggi
• 1° posto: C Mumble, mumble,
• 2° Posto: Java forse c'è spazio per
un linguaggio con concetti
• 3° Posto: Objective-C più moderni, no?
• 4° Posto: C++
• 5° Posto: C#
• 6° Posto: (Visual) Basic
Fonte: Tiobe
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
7. Eccovi Ruby
• Generico, interpretato, “reflective” , con garbage collection
• Ottimizzato per la produttività e felicità
• Conciso ma leggibile con sintassi chiara
• Puro Object oriented – TUTTO è un oggetto (anche le
primitive)
• Programmazione funzionale
• Tipi di dati dinamici / “Duck Typing”
• Open Source (GPL e “The Ruby License”)
8. Ruby e la felicità
Bill Venners: “Per cui, di base
Ruby aiuta ad apprezzare la vita
permettendo di svolgere il suo
lavoro più velocemente e in
modo più divertente”
Yukihiro Matsumoto: “Sì, mi
aiuta. Non so se funzionerà per
lei, ma spero di si”
12. Esecuzione
• Linguaggio interpretato linea per linea
• Utilizzabile come script in modo simile a bash o come linguaggio
server-side
• Tutto accade in runtime. Pertanto, tutto può essere cambiato.
• Non esiste il 'main'. Si esegue come uno script o
interattivamente con il comando irb
• Require permette di caricare codice scritto da noi o da altri (le
cosiddette 'gemme')
• Le gemme sono scaricabili direttamente via internet (con un
metodo simile a CPAN)
13. Nomi degli
identificatori
“CAMEL STYLE”
LaMiaClasse, IlModulo
LA_MIA_COSTANTE = 3.14
il_mio_metodo
variabile_locale = 3.14 “SNAKE STYLE”
@variabile_istanziata
@@variabile_di_classe
$variabile_globale
15. Booleani
Source code: truth.rb
• Le “costanti” booleane sono false e true. In gli unici
valori che sono “falsi” in senso booleano sono: false,
nil
• Se venite dal C e derivati, attenti: zero (0) e la stringa
vuota (“”) risultano true!
16. Booleani
Source code: truth.rb
• Le “costanti” booleane sono false e true. In gli unici
valori che sono “falsi” in senso booleano sono: false,
nil
• Se venite dal C e derivati, attenti: zero (0) e la stringa
vuota (“”) risultano true!
18. Numeric
Source code: numeric.rb
• Tutti i numeri in Ruby sono oggetti e fanno parte della
classe di base Numeric, dotata di molte sottoclassi.
Comprende anche “Infinity” e “Nan”
• Fixnum → 6356
Float → 6,466
BigDecimal → 628363263629,389893
Complex → (2+3i)
Rational → (2/3)
19. Stringhe
Source code: string.rb
• Le stringhe sono codificate in UTF-8 e modificabili
• Oltre agli operatori più comuni, sono previsti anche : +,
<<, []
• Possono comprendere al loro interno variabili con #{}:
w=3; c=”Il valore è #{w}”
• Metodi interessanti: size, each_char, each_line,
empty?, gsub, strip, upcase
20. Array
Source code: array.rb
• Gli Array sono a dimensione variabile, senza tipi
• Molti operatori in comune con le stringhe: +, <<, []
• Di tipo “Enumerabile”, per cui forniti di metodi come
each, select, map, inject .
21. Hash
Source code: hash.rb
• Gli Hash sono array associativi (stile PHP) con chiave
unica.
• Possono essere usati come parametri
• Sono enumerabili
22. Simboli
Source code: symbol.rb
• I simboli sono stringhe immutabili (stile Java)
• Sono una stringa o un identificatore preceduto da due
punti: :il_mio_simbolo
• Usati come chiavi per le hash e come nome dei metodi
• Più efficienti delle stringhe
23. Range
Source code: range.rb
• Un range rappresenta tutti i valoro compresi tra quelli
indicati: 1..100, 2.67...300.676, 'a'...'z'
• Se ci sono due punti, il valore finale è escluso; con tre
punti è incluso
• Metodi intessanti: each, step, include?, member?
24. Regexp
Source code: regexp.rb
• Le espressioni regolari sono delimitate da slash:: /(?
<mese>d{1,2})/(?<giorno>d{1,2})/(?
<anno>d{4})/
• Per controllare un'espressione si usa l'operatore =~
Stringa#match
• Si possono effettuare sostituzioni tramite String#gsub
• Molto potente e utile (specie per le applicazioni web)
25. nil
• nil indica l'assenza di un oggetto. E' il valore che ha
un oggetto non instanziato, e di solito si testa per
prevenire errori
• Ossimoricamente, anche nil è un oggetto, accessibile
da tutti
29. Condizionali
Source code: conditionals.rb
• Non manca il classico: if, elsif, else, end
• Esiste anche il famigerato operatore ternario (“(i>0)?4:8”) e la
struttura case...when...else. Si noti la sinteticità!
manufacturer = case car
when "Focus" then "Ford"
when "Navigator" then "Lincoln"
when "520i" then "BMW"
when "Tundra" then "Nissan"
else "Unknown"
end
30. Cicli
Source code: loops.rb
• Esistono i classici while,until ma il metodo
considerato “giusto” è quello di utilizzare il metodo
each che si applica a qualsiasi oggetto Enumerable.
a = [ "a", "b", "c" ]
a.each {|x| print x, " -- " }
31. Cicli(2)
Source code: loops.rb
• for si usa applicato a un range.
for i in 1..8 { puts i}
• Si possono utilizzare anche metodi applicabili a numeri
quali times, upto, dowto, step che rendono il ciclo
molto elegante
5.times { |i| puts i }
1.upto(5) { |i| puts i }
32. Eccezioni
Source code: exceptions.rb
• Molto simili alla gestione delle eccezioni in altri
linguggi: si lanciano con raise e si catturano con
rescue
• ensure indica un blocco che deve essere sempre
eseguito, retry ri-esegue il codice con errore.
• Ruby ha una gerarchia di eccezioni predefinite basate
su Exception, ma potete definirne di nuove
33. Bash? Chi era
costui?
http://reference.jumpingmonkey.org/programming_languages/ruby/ruby-one-
liners.html
# converti testo da Unix a(LF) a DOS (CR/LF)
$ ruby -ne 'BEGIN{$="rn"}; print $_.chomp' < file.txt
# stampa righe di 65 caratteri o più
$ ruby -pe 'next unless $_.chomp.length >= 65' < file.txt
$ ruby -lpe 'next unless $_.length >= 65' < file.txt
# Stampa il file rimuovendo righe duplicate e consecutive
$ ruby -ne 'puts $_ unless $_ == @prev; @prev = $_' < file.txt
35. Definire e
istanziare
Source code: person.rb
• class definisce una classe
• def definisce un metodo
• initialize è il costruttore
• Gli attributi / variabili d'istanza hanno il prefisso @
• I metodi si richiamano con la notazione oggetto.metodo.
• Le parentesi sono opzionali (!)
• Esistono le classi di visibiltà standard (public, private,
protected)
36. Esempio
class Counter
def initialize
@value=0
end
c=Counter.new
def inc
puts c.value?
@value=@value+1
c.inc
end
puts c.value?
def value?
@value
end
end
37. Getter e Setter
Source code: getter_setter.rb
• Le variabili d'istanza sono SEMPRE private e bisogna
utilizzare getter e setter
• Per i setter, è possibile utilizzare metodi il cui nome
termina per “=” e utilizzare il metodo con sintassi
normale: oggetto.attributo = valore
38. attr_accessor
Source code: attr_accessor.rb
La macro attr_accessor genera in modo automatico
getter and setter per le variabili indicate.
class Esempio
attr_accessor :numero
end
x=Exempio.new;
x.numero=6;
puts x.numero
39. Ereditarietà
Source code: programmer.rb
• Per definire classi derivate, si usa la sintassi
class ClasseFiglia < ClasseBase
• Per richiamare metodi della classe base si usa super
• Per accedere all'oggetto corrente si usa self
40. Mixins
Source code: mixins.rb
• In Ruby l'ereditarietà multipla si realizza con i Moduli
• I moduli sono un'insiemi di metodi costanti e variabili
che possono essere “aggiunti” a una classe
• Simili, ma più potenti, delle Interfaces di Java.
• Non possono essere instanziate
41. Comparable
Source code: comparable.rb
• Se si include il modulo Comparable, si ottengono i
seguenti metodi di confronto: <, <=, ==, =>, >
• Si può utilizzare l'operatore <=> (operatore
'astronave') per confrontare due oggetti. Il risultato
deve essere -1, 0, o 1 (stile strcmp del C)
42. Parametri
• I parametri possono avere valori di default
• Possono avere un numero variabile di parametri
• Se il parametro inizia con un asterisco, indica che è un
array di 0 o più elementi
43. Operatori
Source code: method_operators.rb
• Molti operatori sono in realtà metodi e possono
essere “overridati”
•2 + 2 è equivalente to 2.+(2)
45. Blocchi, Proc e
Lambda
Source code: blocks.rb
• Si possono passare blocchi di codice (in gergo, closure)
come ultimo parametro di un metodo. Il codice viene
richiamato con yield
• In modo simile, esitono gli oggetti Proc, che sono
direttamente eseguibili e Lambdas.
• Permettono alcuni aspetti della programmazione
funzionale
46. Introspezione
Source code: introspection.rb
• Ruby è dotato di molti metodi per controllare la classe
stessa. Per esempio: class, superclass,
ancestors, instance_of?, is_a?, methods,
instance_methods
• Si può controllare se un oggetto implementa un dato
metodo con respond_to?
47. Metodi dinamici
Source code: method_missing_and_send.rb
• Se chiama un metodo in esistente si ottiene
un'eccezione. Ma se aggiungete il metodo
method_missing si può intercettare l'errore e fare cose
intelligenti (per esempio simulare dinamicamente il
nome di un metodo – molto usato in Rails)
• Si può usare send per richiamare un metodo tramite
una stringa o simbolo!
48. Classi aperte
Source code: open_classes.rb
class Integer < Numeric
• In Ruby TUTTE le classi sono def fattoriale
dinamiche e possono essere my_i = self.to_i
modificate in runtime if my_i <= 0
result = 0
• Con l'esempio a lato, posso else
utilizzare questa espressione: result = 1
my_i.downto(2) do |n|
puts 4.fattoriale result = result * n
end
end
result
end
end
49. Standard Library
DRb (distributed object system)
net/ftp, net/http, net/imap, net/pop, net/smtp, net/telnet, open-uri,
openssl
Base64, Digest (HMAC, SHA256, and SHA384)
optparse ì
Pathname, FileUtils
Logger
CSV
REXML (libreria XML in Ruby puro, Nokogiri in Rails)
YAML
Thread, Fiber
Lista completa: http://www.ruby-doc.org/stdlib
50. Testing
Source code: unit_testing.rb
• La metodologia di Testing (TDD) è particolarmente
diffusa nella comunità Ruby Unit tests typically test at
the class or method level
• Test::Unit è il metodo di Test più diffuso
• RSpec e Cucumber are librerie di test molto più potenti
che permettono di scrivere test utilizzando (quasi) il
linguaggio umano
51. Documentazione
Source code: rdoc.rb
• RDoc library usa il codice sorgente per per generare la
documentazione in HTML
• I commenti RDoc precedono classi, moduli e metodi la
loro descrizione
• Simile a JavaDoc, ma meno intrusivo
52. def bellezza?
semplicità
concisione armonia conservativismo
flessibilià
• E' difficile definire un codice “bello” o “poetico” se non
in termini di armonia tra le sue componenti
• Programmare (e leggere il codice) deve essere bello e
divertente
• Happy hacking!
53. Esempio 1
class Array
def qsort
return self if self.size <= 1
Uso:
left, right = [], []
pivot = self.shift
[0,2,3,-4,7.-12].qsort
self.each do |ele|
ele <= pivot ? left << ele : right << ele
end
left.qsort + [pivot] + right.qsort
end
end
55. Esempio 3
# language: it
Scenario: Aggiugere un nuovo utente
Dato mi trovo nella pagina di registrazione
Quando inserisco in "user_name" "Paperino"
E inserisco in "user_email" "paolino@nomail.it"
E inserisco in "user_password" "12345678"
E inserisco in "user_password_confirmation" "12345678"
Quando premo "Crea utente"
Allora dovrei essere nella home page
E dovrei vedere "Utente Paperino creato"
56. Appendice
• Per la serie: potevamo stupirvi con
gli effetti speciali....
57. Una web app in
meno di
2
minuti con Rails
Look, Ma, no GUI! Just 5 LOC!
60. Licenza
Questo lavoro è protetto dalla licenza
Creative Commons BY-SA 3.0 (
http://creativecommons.org/licenses/by-sa/3.0/deed.it)
Il lavoro originale di Peter Marklund
usa la Creative Commons BY 3.0 (si
trova su https://github.com/peter/ruby_basic )