SlideShare uma empresa Scribd logo
1 de 60
Baixar para ler offline
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
Chi sono?

• Insegno Informatica e sistemi da...
  troppo tempo.
• Al Corni dall' AS 2007/2008
• Gestisco il sito di Moodle della
  scuola
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
Parte 1

Introduzione
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)
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
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”)
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”
Caposaldi Ruby
Pragmaticità
Aderenza alle convenzioni
Leggibilità
Bellezza (!)
Parte 2
Struttura ed
Esecuzione
Istruzioni

Le istruzioni sono separate da A CAPO

Potete, opzionalmente, separarle con “;”
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)
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
Suffissi
metodo_pericoloso_o_modificante!

metodo_che_risponde_a_domande?

         metodo_setter=
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!
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!
Parte 3

Tipi di dato
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)
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
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 .
Hash
                    Source code: hash.rb




• Gli Hash sono array associativi (stile PHP) con chiave
  unica.

• Possono essere usati come parametri
• Sono enumerabili
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
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?
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)
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
10 secondi....
              ...per capire cosa fa ogni riga di codice



• ([ 1, 2, 3 ] + [ 3, 4, 5, 6 ] - [ 1 ]).uniq
  =>

  ([] << 1 << 2 << “dietro” ) .unshift(“davanti”)
  =>

  [1,2,3,4,5,6].map { |x| x+1 }
   =>
10 secondi....
              ...per capire cosa fa ogni riga di codice



• ([ 1, 2, 3 ] + [ 3, 4, 5, 6 ] - [ 1 ]).uniq
  => [2, 3, 4, 5, 6]

  ([] << 1 << 2 << “dietro” ) .unshift(“davanti”)
  => ["davanti", 1, 2, "dietro"]

  [1,2,3,4,5,6].map { |x| x+1 }
   => [2, 3, 4, 5, 6, 7]
Parte 4


Strutture di
 controllo
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
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, " -- " }
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 }
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
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
Parte 5

Classi e Oggetti
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)
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
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
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
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
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
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)
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
Operatori
            Source code: method_operators.rb




• Molti operatori sono in realtà metodi e possono
  essere “overridati”

•2   + 2 è equivalente to 2.+(2)
Parte 6

Rapidi cenni a cose
   interessanti
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
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?
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!
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
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
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
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
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!
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
Esempio 2
class User < ActiveRecord::Base
 attr_accessible :description, :email, :location, :name, :nick, :password,
:password_confirmation
 has_many :groups, dependent: :destroy
 has_many :interests, dependent: :destroy
 valid_email_regex = /A[w+-.]+@[a-zd-.]+.[a-z]+z/i
 validates :email, :presence => true,
       :format    => { with: valid_email_regex },
       :uniqueness => { case_sensitive: false }
 validates :name, presence: true, length: { maximum: 50 }
 validates :password, length: { minimum: 6, maximum:15 }
 validates_confirmation_of :password
 validates_presence_of :password_confirmation, :if => :password_changed?
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"
Appendice
• Per la serie: potevamo stupirvi con
  gli effetti speciali....
Una web app in
   meno di

        2
minuti con Rails
   Look, Ma, no GUI! Just 5 LOC!
E' finita!


 GRAZIE PER
L'ATTENZIONE
Sitologia

•     tryruby.org (principianti)
•      rubymonk.com
    (principianti/intermedi)
•      rubykoans.com
    (intermedi/avanzati)
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 )

Mais conteúdo relacionado

Mais procurados

06 1 array_stringhe_typedef
06 1 array_stringhe_typedef06 1 array_stringhe_typedef
06 1 array_stringhe_typedefPiero Fraternali
 
Introduzione a JavaScript
Introduzione a JavaScriptIntroduzione a JavaScript
Introduzione a JavaScriptGiovanni Buffa
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#Marco Parenzan
 
JavaScript Object Oriented
JavaScript Object OrientedJavaScript Object Oriented
JavaScript Object OrientedManuel Scapolan
 
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in DelphiMarco Breveglieri
 
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...UltraUploader
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java BaseK-Tech Formazione
 
Pycrashcourse
PycrashcoursePycrashcourse
Pycrashcourserik0
 
Corso Python Deltapromo lezione 1
Corso Python Deltapromo   lezione 1Corso Python Deltapromo   lezione 1
Corso Python Deltapromo lezione 1Paolo Ferretti
 
Gestione della memoria in C++
Gestione della memoria in C++Gestione della memoria in C++
Gestione della memoria in C++Ilio Catallo
 
Functional Programming in Java - Le Espressioni Lambda
Functional Programming in Java - Le Espressioni LambdaFunctional Programming in Java - Le Espressioni Lambda
Functional Programming in Java - Le Espressioni LambdaEzio Sperduto, PhD
 

Mais procurados (20)

06 1 array_stringhe_typedef
06 1 array_stringhe_typedef06 1 array_stringhe_typedef
06 1 array_stringhe_typedef
 
Pillole di C++
Pillole di C++Pillole di C++
Pillole di C++
 
Introduzione a JavaScript
Introduzione a JavaScriptIntroduzione a JavaScript
Introduzione a JavaScript
 
iOS_Course_6
iOS_Course_6iOS_Course_6
iOS_Course_6
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#
 
JavaScript Object Oriented
JavaScript Object OrientedJavaScript Object Oriented
JavaScript Object Oriented
 
2006 Py03 intermedio
2006 Py03 intermedio2006 Py03 intermedio
2006 Py03 intermedio
 
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
 
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java Base
 
Pycrashcourse
PycrashcoursePycrashcourse
Pycrashcourse
 
2006 Py02 base
2006 Py02 base2006 Py02 base
2006 Py02 base
 
2008 python
2008 python2008 python
2008 python
 
Rubynetto
RubynettoRubynetto
Rubynetto
 
Corso Python Deltapromo lezione 1
Corso Python Deltapromo   lezione 1Corso Python Deltapromo   lezione 1
Corso Python Deltapromo lezione 1
 
Gestione della memoria in C++
Gestione della memoria in C++Gestione della memoria in C++
Gestione della memoria in C++
 
Variabili
VariabiliVariabili
Variabili
 
Functional Programming in Java - Le Espressioni Lambda
Functional Programming in Java - Le Espressioni LambdaFunctional Programming in Java - Le Espressioni Lambda
Functional Programming in Java - Le Espressioni Lambda
 
OOP with C#
OOP with C#OOP with C#
OOP with C#
 
Vb.Net
Vb.NetVb.Net
Vb.Net
 

Destaque (18)

Lo stack: tipo di dato astratto e implementazione in Java
Lo stack: tipo di dato astratto e implementazione in JavaLo stack: tipo di dato astratto e implementazione in Java
Lo stack: tipo di dato astratto e implementazione in Java
 
Uefi: l'eterna lotta tra il bene e il male
Uefi: l'eterna lotta tra il bene e il maleUefi: l'eterna lotta tra il bene e il male
Uefi: l'eterna lotta tra il bene e il male
 
Corso Moodle: perché?
Corso Moodle: perché?Corso Moodle: perché?
Corso Moodle: perché?
 
Dhcp
DhcpDhcp
Dhcp
 
Il ciclo for
Il ciclo forIl ciclo for
Il ciclo for
 
Corso Moodle: presentazione
Corso Moodle: presentazioneCorso Moodle: presentazione
Corso Moodle: presentazione
 
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Programmazione a oggetti tramite la macchina del caffé (pt. 3)Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
 
Eccezioni in java
Eccezioni in javaEccezioni in java
Eccezioni in java
 
L'avvento del programmatore sociale
L'avvento del programmatore socialeL'avvento del programmatore sociale
L'avvento del programmatore sociale
 
Investire nelle user story
Investire nelle user storyInvestire nelle user story
Investire nelle user story
 
Moodle: i compiti (homework)
Moodle: i compiti (homework)Moodle: i compiti (homework)
Moodle: i compiti (homework)
 
Routing dinamico
Routing dinamicoRouting dinamico
Routing dinamico
 
Espressioni regolari
Espressioni regolariEspressioni regolari
Espressioni regolari
 
The Sequel to sql
The Sequel to sqlThe Sequel to sql
The Sequel to sql
 
Controllo di versione e Git
Controllo di versione e GitControllo di versione e Git
Controllo di versione e Git
 
Introduzione al dns
Introduzione al dnsIntroduzione al dns
Introduzione al dns
 
Il sistema binario
Il sistema binarioIl sistema binario
Il sistema binario
 
Insegnare Agile
Insegnare AgileInsegnare Agile
Insegnare Agile
 

Semelhante a Ruby in 25 minuti

Introduzione a TypeScript
Introduzione a TypeScriptIntroduzione a TypeScript
Introduzione a TypeScriptSinergia Totale
 
Le 10 principali ragioni per cui Ruby fa pena
Le 10 principali ragioni per cui Ruby fa penaLe 10 principali ragioni per cui Ruby fa pena
Le 10 principali ragioni per cui Ruby fa penaAdvenias
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptSinergia Totale
 
Javascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il webJavascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il webRoberto Messora
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritornolordarthas
 
Clean programming 2020-01-25 @ Modena Tech Summit
Clean programming 2020-01-25 @ Modena Tech SummitClean programming 2020-01-25 @ Modena Tech Summit
Clean programming 2020-01-25 @ Modena Tech SummitDavide Muzzarelli
 
HTML5 Italy: Mai più CSS, fogli di stile moderni con LESS - Salvatore Romeo
HTML5 Italy: Mai più CSS, fogli di stile moderni con LESS - Salvatore RomeoHTML5 Italy: Mai più CSS, fogli di stile moderni con LESS - Salvatore Romeo
HTML5 Italy: Mai più CSS, fogli di stile moderni con LESS - Salvatore Romeomarcocasario
 
LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsJUG Genova
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventPietro Di Bello
 
Presentazione Oz - Mozart
Presentazione Oz - MozartPresentazione Oz - Mozart
Presentazione Oz - Mozartfede
 
Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)STELITANO
 
php: back to basics
php: back to basicsphp: back to basics
php: back to basicsFabio Mora
 
Scala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéScala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéEdmondo Porcu
 
Programmazione funzionale e Stream in Java
Programmazione funzionale e Stream in JavaProgrammazione funzionale e Stream in Java
Programmazione funzionale e Stream in JavaCristina Attori
 
Lezione 1 (27 febbraio 2012)
Lezione 1 (27 febbraio 2012)Lezione 1 (27 febbraio 2012)
Lezione 1 (27 febbraio 2012)STELITANO
 
Lezione 1 (27 febbraio 2012)
Lezione 1 (27 febbraio 2012)Lezione 1 (27 febbraio 2012)
Lezione 1 (27 febbraio 2012)STELITANO
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con ScalaFranco Lombardo
 
Corso IFTS CyberSecurity Expert - Cifrai Asimmetrici
Corso IFTS CyberSecurity Expert - Cifrai AsimmetriciCorso IFTS CyberSecurity Expert - Cifrai Asimmetrici
Corso IFTS CyberSecurity Expert - Cifrai AsimmetriciMassimiliano Masi
 

Semelhante a Ruby in 25 minuti (20)

Introduzione a TypeScript
Introduzione a TypeScriptIntroduzione a TypeScript
Introduzione a TypeScript
 
Le 10 principali ragioni per cui Ruby fa pena
Le 10 principali ragioni per cui Ruby fa penaLe 10 principali ragioni per cui Ruby fa pena
Le 10 principali ragioni per cui Ruby fa pena
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScript
 
Javascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il webJavascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il web
 
Sviluppo web dall'antichità all'avanguardia e ritorno
Sviluppo web  dall'antichità all'avanguardia e ritornoSviluppo web  dall'antichità all'avanguardia e ritorno
Sviluppo web dall'antichità all'avanguardia e ritorno
 
Clean programming 2020-01-25 @ Modena Tech Summit
Clean programming 2020-01-25 @ Modena Tech SummitClean programming 2020-01-25 @ Modena Tech Summit
Clean programming 2020-01-25 @ Modena Tech Summit
 
Bash intro
Bash introBash intro
Bash intro
 
HTML5 Italy: Mai più CSS, fogli di stile moderni con LESS - Salvatore Romeo
HTML5 Italy: Mai più CSS, fogli di stile moderni con LESS - Salvatore RomeoHTML5 Italy: Mai più CSS, fogli di stile moderni con LESS - Salvatore Romeo
HTML5 Italy: Mai più CSS, fogli di stile moderni con LESS - Salvatore Romeo
 
LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMs
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA event
 
Presentazione Oz - Mozart
Presentazione Oz - MozartPresentazione Oz - Mozart
Presentazione Oz - Mozart
 
Javascript
JavascriptJavascript
Javascript
 
Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)
 
php: back to basics
php: back to basicsphp: back to basics
php: back to basics
 
Scala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéScala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perché
 
Programmazione funzionale e Stream in Java
Programmazione funzionale e Stream in JavaProgrammazione funzionale e Stream in Java
Programmazione funzionale e Stream in Java
 
Lezione 1 (27 febbraio 2012)
Lezione 1 (27 febbraio 2012)Lezione 1 (27 febbraio 2012)
Lezione 1 (27 febbraio 2012)
 
Lezione 1 (27 febbraio 2012)
Lezione 1 (27 febbraio 2012)Lezione 1 (27 febbraio 2012)
Lezione 1 (27 febbraio 2012)
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con Scala
 
Corso IFTS CyberSecurity Expert - Cifrai Asimmetrici
Corso IFTS CyberSecurity Expert - Cifrai AsimmetriciCorso IFTS CyberSecurity Expert - Cifrai Asimmetrici
Corso IFTS CyberSecurity Expert - Cifrai Asimmetrici
 

Mais de Marcello Missiroli

Mais de Marcello Missiroli (11)

Algorithmist guide II
Algorithmist guide IIAlgorithmist guide II
Algorithmist guide II
 
Guida del perfetto Algoritmista I
Guida del perfetto Algoritmista IGuida del perfetto Algoritmista I
Guida del perfetto Algoritmista I
 
Workshop: Introduzione ad TDD
Workshop: Introduzione ad TDDWorkshop: Introduzione ad TDD
Workshop: Introduzione ad TDD
 
Dal c a Java (3/3)
Dal c a Java (3/3)Dal c a Java (3/3)
Dal c a Java (3/3)
 
Dal C a Java (2/3)
Dal C a Java (2/3)Dal C a Java (2/3)
Dal C a Java (2/3)
 
Dal C a Java (1/3)
Dal C a Java (1/3)Dal C a Java (1/3)
Dal C a Java (1/3)
 
Sviluppo degli algoritmi
Sviluppo degli algoritmiSviluppo degli algoritmi
Sviluppo degli algoritmi
 
5 stadi dello sviluppo di un gruppo
5 stadi dello sviluppo di un gruppo5 stadi dello sviluppo di un gruppo
5 stadi dello sviluppo di un gruppo
 
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!
 
Big O Notation
Big O NotationBig O Notation
Big O Notation
 
Introduzione a java doc
Introduzione a java docIntroduzione a java doc
Introduzione a java doc
 

Último

Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Associazione Digital Days
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Associazione Digital Days
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Associazione Digital Days
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Associazione Digital Days
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoQuotidiano Piemontese
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Associazione Digital Days
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Associazione Digital Days
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Associazione Digital Days
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Associazione Digital Days
 

Último (9)

Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 Torino
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
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”
  • 9. Caposaldi Ruby Pragmaticità Aderenza alle convenzioni Leggibilità Bellezza (!)
  • 11. Istruzioni Le istruzioni sono separate da A CAPO Potete, opzionalmente, separarle con “;”
  • 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
  • 26. 10 secondi.... ...per capire cosa fa ogni riga di codice • ([ 1, 2, 3 ] + [ 3, 4, 5, 6 ] - [ 1 ]).uniq => ([] << 1 << 2 << “dietro” ) .unshift(“davanti”) => [1,2,3,4,5,6].map { |x| x+1 } =>
  • 27. 10 secondi.... ...per capire cosa fa ogni riga di codice • ([ 1, 2, 3 ] + [ 3, 4, 5, 6 ] - [ 1 ]).uniq => [2, 3, 4, 5, 6] ([] << 1 << 2 << “dietro” ) .unshift(“davanti”) => ["davanti", 1, 2, "dietro"] [1,2,3,4,5,6].map { |x| x+1 } => [2, 3, 4, 5, 6, 7]
  • 28. Parte 4 Strutture di controllo
  • 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
  • 34. Parte 5 Classi e Oggetti
  • 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)
  • 44. Parte 6 Rapidi cenni a cose interessanti
  • 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
  • 54. Esempio 2 class User < ActiveRecord::Base attr_accessible :description, :email, :location, :name, :nick, :password, :password_confirmation has_many :groups, dependent: :destroy has_many :interests, dependent: :destroy valid_email_regex = /A[w+-.]+@[a-zd-.]+.[a-z]+z/i validates :email, :presence => true, :format => { with: valid_email_regex }, :uniqueness => { case_sensitive: false } validates :name, presence: true, length: { maximum: 50 } validates :password, length: { minimum: 6, maximum:15 } validates_confirmation_of :password validates_presence_of :password_confirmation, :if => :password_changed?
  • 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!
  • 58. E' finita! GRAZIE PER L'ATTENZIONE
  • 59. Sitologia • tryruby.org (principianti) • rubymonk.com (principianti/intermedi) • rubykoans.com (intermedi/avanzati)
  • 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 )