Ruby in 25 minuti

1,240 views

Published on

Un piccolo speech che ho tenuto a scuola.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,240
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
23
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Ruby in 25 minuti

  1. 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. 2. Chi sono?• Insegno Informatica e sistemi da... troppo tempo.• Al Corni dall AS 2007/2008• Gestisco il sito di Moodle della scuola
  3. 3. Cosa vedremo?In questa rapida esposizione vedremocosè Ruby, i suoi punti di forza eperché dovreste impararne tutti un poprima di andare a lavorare nel campo.In particolare mi concentrerò un ciòche rende distingue Ruby daglialtri linguaggi di programmazionein modo radicale
  4. 4. Parte 1Introduzione
  5. 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. 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) BasicFonte: Tiobehttp://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
  7. 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. 8. Ruby e la felicitàBill Venners: “Per cui, di baseRuby aiuta ad apprezzare la vitapermettendo di svolgere il suolavoro più velocemente e inmodo più divertente”Yukihiro Matsumoto: “Sì, miaiuta. Non so se funzionerà perlei, ma spero di si”
  9. 9. Caposaldi RubyPragmaticitàAderenza alle convenzioniLeggibilitàBellezza (!)
  10. 10. Parte 2Struttura edEsecuzione
  11. 11. IstruzioniLe istruzioni sono separate da A CAPOPotete, opzionalmente, separarle con “;”
  12. 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. 13. Nomi degli identificatori “CAMEL STYLE”LaMiaClasse, IlModuloLA_MIA_COSTANTE = 3.14il_mio_metodovariabile_locale = 3.14 “SNAKE STYLE”@variabile_istanziata@@variabile_di_classe$variabile_globale
  14. 14. Suffissimetodo_pericoloso_o_modificante!metodo_che_risponde_a_domande? metodo_setter=
  15. 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. 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!
  17. 17. Parte 3Tipi di dato
  18. 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. 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. 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. 21. Hash Source code: hash.rb• Gli Hash sono array associativi (stile PHP) con chiave unica.• Possono essere usati come parametri• Sono enumerabili
  22. 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. 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. 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 unespressione si usa loperatore =~ Stringa#match• Si possono effettuare sostituzioni tramite String#gsub• Molto potente e utile (specie per le applicazioni web)
  25. 25. nil• nil indica lassenza 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. 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. 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. 28. Parte 4Strutture di controllo
  29. 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. 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. 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. 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. 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. 34. Parte 5Classi e Oggetti
  35. 35. Definire e istanziare Source code: person.rb• class definisce una classe• def definisce un metodo• initialize è il costruttore• Gli attributi / variabili distanza 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. 36. Esempioclass 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 endend
  37. 37. Getter e Setter Source code: getter_setter.rb• Le variabili distanza 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. 38. attr_accessor Source code: attr_accessor.rbLa macro attr_accessor genera in modo automaticogetter and setter per le variabili indicate.class Esempioattr_accessor :numeroendx=Exempio.new;x.numero=6;puts x.numero
  39. 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 alloggetto corrente si usa self
  40. 40. Mixins Source code: mixins.rb• In Ruby lereditarietà multipla si realizza con i Moduli• I moduli sono uninsiemi 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. 41. Comparable Source code: comparable.rb• Se si include il modulo Comparable, si ottengono i seguenti metodi di confronto: <, <=, ==, =>, >• Si può utilizzare loperatore <=> (operatore astronave) per confrontare due oggetti. Il risultato deve essere -1, 0, o 1 (stile strcmp del C)
  42. 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. 43. Operatori Source code: method_operators.rb• Molti operatori sono in realtà metodi e possono essere “overridati”•2 + 2 è equivalente to 2.+(2)
  44. 44. Parte 6Rapidi cenni a cose interessanti
  45. 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. 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. 47. Metodi dinamici Source code: method_missing_and_send.rb• Se chiama un metodo in esistente si ottiene uneccezione. Ma se aggiungete il metodo method_missing si può intercettare lerrore 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. 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 lesempio 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. 49. Standard LibraryDRb (distributed object system)net/ftp, net/http, net/imap, net/pop, net/smtp, net/telnet, open-uri,opensslBase64, Digest (HMAC, SHA256, and SHA384)optparse ìPathname, FileUtilsLoggerCSVREXML (libreria XML in Ruby puro, Nokogiri in Rails)YAMLThread, FiberLista completa: http://www.ruby-doc.org/stdlib
  50. 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. 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. 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. 53. Esempio 1class 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 endend
  54. 54. Esempio 2class 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. 55. Esempio 3# language: itScenario: 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. 56. Appendice• Per la serie: potevamo stupirvi con gli effetti speciali....
  57. 57. Una web app in meno di 2minuti con Rails Look, Ma, no GUI! Just 5 LOC!
  58. 58. E finita! GRAZIE PERLATTENZIONE
  59. 59. Sitologia• tryruby.org (principianti)• rubymonk.com (principianti/intermedi)• rubykoans.com (intermedi/avanzati)
  60. 60. LicenzaQuesto lavoro è protetto dalla licenzaCreative Commons BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/deed.it)Il lavoro originale di Peter Marklundusa la Creative Commons BY 3.0 (sitrova su https://github.com/peter/ruby_basic )

×