Idiomatic Ruby

869 views
790 views

Published on

Ruby para humanos.
En esta presentación explico el poder de Ruby, y sus idiomas (expresiones propias del lenguaje) que hacen que Ruby sea flexible, expresivo y dinámico.

Presentada en el evento BarCamp Mexico 2

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
869
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
10
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Idiomatic Ruby

  1. 1. Idiomatic Ruby <3 Ruby www.mexicoonrails.com.mx Rubén Medellín - 2009
  2. 2. Love.ruby do |as, much| as.you :can, without end
  3. 3. Programs must be written for people to read, and only incidentally for machines to execute. - Abelson & Sussman
  4. 4. Método de clase Llamada a Parámetros bloque variables Love.ruby do |as, *much| as.you :can, without end Método o variable Llamada a Símbolos método
  5. 5. Ruby como un quot;amplificador mentalquot; [Andy Hunt]
  6. 6. Siempre hay más de una forma de hacer lo mismo Flexibilidad Legibilidad Agilidad
  7. 7. for (int i = 10; i < 20; i++) { do_something(i) }
  8. 8. for i in xrange(10, 20): do_something(i)
  9. 9. 10.upto(20){|i| do_something(i)}
  10. 10. Todo es un objeto >> quot;Helloquot;.class => String >> 1.class => Fixnum >> nil.class => NilClass >> Class.class => Class >> method(:puts).class => Method
  11. 11. Tipos básicos 1 1.2 'simple string' quot;String with #{something} insidequot; :symbol true nil [quot;arrayquot;, nil, 5, :whatever] { :this => true, :that => quot;Awesomeness!quot; } /rege(x|X)p*/ 10..20
  12. 12. Llamada a métodos puts(quot;Hello worldquot;) # Built-in [1, 2, 3, 4, 5].first # De instancia Time.now # De clase quot;I'm not javaquot;.upcase( ) # Con... puts quot;Mira mamá, sin paréntesis!quot; # o sin {1 => 'uno', 2 => 'dos' }.has_key? 3 # ??? quot;ABCquot;.succ! # !!! p :implicit => Hash # Es un hash! los_simbolos[ { :tambien => :son} + quot;metodosquot; ] NoMethodError: undefined method `+' for {:tambien => :son }:Hash
  13. 13. Definiendo métodos def con_enjundia!(algo) puts quot;#{algo}, caray!quot; end >> con_enjundia! quot;Hola mundoquot; Hola mundo, caray! => nil Último valor regresado
  14. 14. Bloques Blocks.allow(you, to) do |weird, things| just.remember to => close(quot;Them withquot;) end # Un ejemplo más mundano... [1, 2, 3, 4, 5].each do |number| puts number end
  15. 15. Bloques Blocks.allow(you, to) do |weird, things| just.remember to => close(quot;Them withquot;) end # Un ejemplo más mundano... [1, 2, 3, 4, 5].each do |number| puts number end ¿De dónde salió?
  16. 16. Yield def cuadrados_hasta(limite) i=1 cuadrado = 1 while cuadrado <= limite yield cuadrado i += 1 Aquí está el truco cuadrado = i * i end end
  17. 17. Yield yield permite pasar variables locales al contexto del bloque en donde se ejecuta >> cuadrados_hasta 100 do |num| >> print num, quot;.. quot; >> end => 1.. 4.. 9.. 16.. 25.. 36.. 49.. 64.. 81.. 100..
  18. 18. Bloques Los bloques pueden escribirse de la forma algo do |*variables| # ... end o en su forma compacta algo {|*variables| #... }
  19. 19. Algunas expresiones comunes === Modificadores en línea Las condiciones if, while (y sus complementos unless y until) se pueden utilizar en la misma línea sin necesidad de bloque
  20. 20. Algunas expresiones comunes Por ejemplo: if objeto.valid? objecto.save! end se convierte en: objecto.save! if objecto.valid?
  21. 21. Algunas expresiones comunes fire_missile! unless @peace Variables de x=0 instancia puts x until (x+=1) == 10 Operadores keep_drinking while not drunk?conjugados
  22. 22. Algunas expresiones comunes === Operadores and y or Las palabras and y or son equivalentes a los métodos && y || Se evalúan en corto circuito y devuelven el valor que hace que se cumpla la condición
  23. 23. Algunas expresiones comunes Diferentes usos: mensaje = error.msg or quot;Algo malo pasó!quot; comida = (refri and refri.contenido) or Pizzerolas.new @respuesta_al_universo ||= 42
  24. 24. Algunas expresiones comunes === Atributos El método attr_accesor, y sus parientes attr_reader y attr_writer, nos proveen de un shortcut para getters y setters. De otra manera, uno puede definirlos por separado (Los métodos pueden terminar en quot;=” )!
  25. 25. Algunas expresiones comunes class SuperHeroe attr_accessor :nombre attr_reader :identidad_secreta def initialize(id) @identidad_secreta = id end def identidad_secreta=(x) raise quot;No! #{x} es un mal nombrequot; end end
  26. 26. Algunas expresiones comunes === Reflexión Ruby se caracteriza por reflexión, es decir, la capacidad de meter mano en sus métodos, clases y módulos en tiempo de ejecución
  27. 27. Algunas expresiones comunes class Integer def method_missing(que) if self > 0 and self < 10 self.downto(10) do |i| puts quot;#{i} #{que}s, se columpiaban...quot; end end end end
  28. 28. Algunas expresiones comunes === Formas de pasar parámetros Es común especificar parámetros con valores default, o aceptar hashes como último parámetro def hamburguesa(queso = true, extra = {}) puts quot;Sale una hamburguesa #{queso ? 'con' : 'sin'} queso!quot; sabor = extra[:refresco] puts quot;Viene con refresco de #{sabor}quot; if sabor end
  29. 29. Algunas expresiones comunes === Formas de pasar parámetros Es común especificar parámetros con valores default, o aceptar hashes como último parámetro* * Alternativa chafa a los parámetros con nombre, pero funciona bien
  30. 30. Algunas expresiones comunes def hamburguesa(queso = true, extra = {}) puts quot;Sale una hamburguesa #{queso ? 'con' : 'sin'} queso!quot; sabor = extra[:refresco] puts quot;Viene con refresco de #{sabor}quot; if sabor end
  31. 31. Lee código No hay mejor manera de aprender un lenguaje que practicándolo. Leer código en Ruby hasta es placentero!
  32. 32. begin answer while questions? rescue raise EndOfPresentation ensure people.map(&:thanks) end

×