Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
¿Por qué Ruby?
Descubre su expresividad
(y peculiaridades)
Sobre mi
(muy brevemente)
Ruby idiomatico
¿idiomatico?
Ruby

Yukihiro
Matsumoto

“Matz”
Ruby
●

Orientado a objetos

●

Interpretado

●

(Muy) Dinámico

●

Alto nivel

●

Basado en Perl, Smalltalk, Lisp, C, ......
Ruby
●

Orientado a objetos

●

Interpretado

●

(Muy) Dinámico

●

Alto nivel

●

Basado en Perl, Smalltalk, Lisp, C, ......
Ruby
●

Cercano al lenguaje natural

●

Fácil de leer y escribir

●

Eficiente

●

¡DIVERTIDO! :-)))
¿Paréntesis?

puts(“¿Los ponemos co?”)
¿Paréntesis?

puts “No es necesario”
Orientado a objetos
(de verdad de la buena)
Orientado a objetos
"D-Labs mola mucho".class
42.class
nil.class
[1, 2, 3].class
(1..9).class

#
#
#
#
#

=>
=>
=>
=>
=>

...
Orientado a objetos
"zARAGOZA-rb".swapcase

# => "Zaragoza-RB"

-12345.abs

# => 12345

5 * 10

# => 50
Orientado a objetos
"zARAGOZA-rb".swapcase

# => "Zaragoza-RB"

-12345.abs

# => 12345

5 * 10

# => 50

5.*(10)

# => Syn...
Orientado a objetos
Time.now
Time.now.thursday?

# => 2013-06-27...
# => true

2013.even?
5.times{ puts "DRY" }

# => fals...
Orientado a objetos

"DAba Le ArrOz Al A ZoRrA ELaBAd".downcase.reverse

# => "dabale arroz a la zorra el abad"
True / nil / false
if 0
"0 es verdadero"
else
"0 es falso"
end
True / nil / false
if 0
"0 es verdadero"
else
"0 es falso"
end # => "0 es verdadero"

Todo es true excepto nil y false
If / unless
if !order.valid?
order.block
end
If / unless
if !order.valid?
order.block
end
order.block unless order.valid?
¿¡ Exclamaciones e
interrogaciones en
métodos !?
Convenio
Interrogación retorna booleano

[1, 2, 3, 5].empty?

# => false
Convenio
Exclamación acción destructiva

array = [1, 2, 3]
array.reverse
array

# => [1, 2, 3]
# => [3, 2, 1]
# => [1, 2, ...
Return o no return
●

Cualquier expresión retorna un valor

●

Rara vez usas return*

* Es una opinión personal
Return o no return
class UserKarma
def reset
# Do stuff
total = 0
end
end
Estructuras
condicionales
@user = nil
if params[:id]
@user = User.find(params[:id])
else
@user = User.new
end

De “Ruby mo...
Estructuras
condicionales
@user = if params[:id]
User.find(params[:id])
else
User.new
end

De “Ruby mola y por qué” de Ser...
Estructuras
condicionales
Operador ternario:
@user = params[:id] ? User.find(params[:id]) : User.new

De “Ruby mola y por ...
Estructuras
condicionales
if my_var
return my_var
else
return another_value
end

http://www.zepho.com/download/ruby-idioms...
Estructuras
condicionales
if my_var
return my_var
else
return another_value
end

if my_var
my_var
else
another_value
end

...
Estructuras
condicionales
if my_var
return my_var
else
return another_value
end

if my_var
my_var
else
another_value
end

...
Asignaciones
@post = Post.find(params[:id])
if @post
@post.destroy
end

De “Ruby mola y por qué” de Sergio Gil - http://ww...
Asignaciones
@post = Post.find(params[:id])
if @post
@post.destroy
end
if @post = Post.find(params[:id])
@post.destroy
end...
Asignaciones
En paralelo:
first, last, street = "Pi", "Filemon", "13 rue del percebe"
# => ["Pi", "Filemon", "13 rue del p...
Asignaciones
@name = "Default name" unless @name

http://www.zepho.com/download/ruby-idioms.pdf
Asignaciones
@name = "Default name" unless @name

@name ||= "Default name"

http://www.zepho.com/download/ruby-idioms.pdf
Asignaciones
Variaciones:
a = 1
a += 1
a *= 5

# => 1
# => 2
# => 10

http://www.zepho.com/download/ruby-idioms.pdf
Clase Array
(módulo enumerable)

De “Ruby mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y...
Operaciones
foo = [1, 2, 3]
bar = [3, 4, 5]
foo
foo
foo
foo

+
*
&
|

bar
2
bar
bar

#
#
#
#

=>
=>
=>
=>

[1, 2, 3, 3, 4,...
Iteradores - each
foo.each do |item|
puts item
end
foo.each{|item| puts item } # => [1, 2, 3]
Iteradores - map
foo.map do |item|
item*2
end
foo.map{|item| item*2 }

# => [2, 4, 6]
Iteradores - inject
foo.inject do |sum, n|
sum + n
end
foo.inject{|sum, n| sum + n } # => 6
Otros métodos
[1, 1, 1, 2].uniq

# => [1, 2]

[1, [2, 3, [4]], 5].flatten # => [1, 2, 3, 4, 5]
[nil, 1, nil, 2, 3].compact...
Otros métodos
[1, 2, 3, 4].find {|n| n % 3 == 0}
# => 3
[1, 2, 3, 4].find_all {|n| n % 2 == 0}
# => [2, 4]
Ejemplos prácticos

De “Ruby mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y-por-qu
Ejemplo 1
●

Calcular el precio con IVA de la lista de precios:

precios = [10, 12, 20, 50]
pvp
= []
precios.each do |prec...
Ejemplo 1
●

Calcular el precio con IVA de la lista de
precios:

precios = [10, 12, 20, 50]
pvp = precios.map {|precio| pr...
Ejemplo 2
●

Calcula la suma total de una lista de precios:

precios = [2.1, 2.52, 4.2, 10.5]
total
= 0
precios.each do |p...
Ejemplo 2
●

Calcula la suma total de una lista de
precios:

precios = [2.1, 2.52, 4.2, 10.5]
total

= precios.inject{|sum...
Clases y métodos
Clases y métodos
●

Típica clase coche con su marca,
modelo y color
Clases y métodos
class Car
def initialize(brand=nil, model=nil)
@brand = brand
@model = model
end
def brand
@brand
end
def...
Clases y métodos
class Car
def initialize(brand=nil, model=nil)
@brand = brand
@model = model
end
...
end
Clases y métodos
...
def color
@color
end
def color=(new_color)
@color = new_color
end
...
end
Clases y métodos
class Car
attr_accessor :brand, :model, :color
def initialize(brand=nil, model=nil)
@brand = brand
@model...
Clases y métodos
Los métodos sus parámetros:
●

Obligatorios

●

Con valor por defecto

●

Aceptar hashes, arrays y bloque...
Clases y métodos
Ejemplo de parámetro opcional:
def foo(a=nil)
# do someting
end
Clases y métodos
Ejemplo de parámetros obligatorios:
def foo(a, b)
# do someting
end
Clases y métodos
Ejemplo de parámetros obligatorios:
def foo(a, b, *c)
# do someting
end
Clases y métodos
Ejemplo de parámetros obligatorios:
def foo(a, options={})
# do someting
end
Clases y métodos
Ejemplo:
def foo(mandatory, value_not_needed=42, options={})
puts "#{mandatory} - #{value_not_needed}"
pu...
Muchas cosas quedan
en el tintero :(
¿Preguntas?
¡Gracias! :)
Sobre mi
Rafa García
Ando por:
- Twitter: @leptom
- Email: contacto@rafagarcia.net
- Github: rgo
Upcoming SlideShare
Loading in …5
×

¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

384 views

Published on

Presentación muy básica sobre Ruby para Zaragozarb.

En ella se muestran detalles que me llamaron la atención cuando comencé tiempo ha. También hicimos una serie de ejercicios que consistían en convertir código Ruby a un código más estilo Ruby.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

  1. 1. ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)
  2. 2. Sobre mi (muy brevemente)
  3. 3. Ruby idiomatico
  4. 4. ¿idiomatico?
  5. 5. Ruby Yukihiro Matsumoto “Matz”
  6. 6. Ruby ● Orientado a objetos ● Interpretado ● (Muy) Dinámico ● Alto nivel ● Basado en Perl, Smalltalk, Lisp, C, ... ● Metaprogramación ● ….
  7. 7. Ruby ● Orientado a objetos ● Interpretado ● (Muy) Dinámico ● Alto nivel ● Basado en Perl, Smalltalk, Lisp, C, ... ● Metaprogramación ● ….
  8. 8. Ruby ● Cercano al lenguaje natural ● Fácil de leer y escribir ● Eficiente ● ¡DIVERTIDO! :-)))
  9. 9. ¿Paréntesis? puts(“¿Los ponemos co?”)
  10. 10. ¿Paréntesis? puts “No es necesario”
  11. 11. Orientado a objetos (de verdad de la buena)
  12. 12. Orientado a objetos "D-Labs mola mucho".class 42.class nil.class [1, 2, 3].class (1..9).class # # # # # => => => => => String Fixnum NilClass Array Range
  13. 13. Orientado a objetos "zARAGOZA-rb".swapcase # => "Zaragoza-RB" -12345.abs # => 12345 5 * 10 # => 50
  14. 14. Orientado a objetos "zARAGOZA-rb".swapcase # => "Zaragoza-RB" -12345.abs # => 12345 5 * 10 # => 50 5.*(10) # => Syntactic sugar
  15. 15. Orientado a objetos Time.now Time.now.thursday? # => 2013-06-27... # => true 2013.even? 5.times{ puts "DRY" } # => false # => 5
  16. 16. Orientado a objetos "DAba Le ArrOz Al A ZoRrA ELaBAd".downcase.reverse # => "dabale arroz a la zorra el abad"
  17. 17. True / nil / false if 0 "0 es verdadero" else "0 es falso" end
  18. 18. True / nil / false if 0 "0 es verdadero" else "0 es falso" end # => "0 es verdadero" Todo es true excepto nil y false
  19. 19. If / unless if !order.valid? order.block end
  20. 20. If / unless if !order.valid? order.block end order.block unless order.valid?
  21. 21. ¿¡ Exclamaciones e interrogaciones en métodos !?
  22. 22. Convenio Interrogación retorna booleano [1, 2, 3, 5].empty? # => false
  23. 23. Convenio Exclamación acción destructiva array = [1, 2, 3] array.reverse array # => [1, 2, 3] # => [3, 2, 1] # => [1, 2, 3] array = [1, 2, 3] array.reverse! array # => [1, 2, 3] # => [3, 2, 1] # => [3, 2, 1]
  24. 24. Return o no return ● Cualquier expresión retorna un valor ● Rara vez usas return* * Es una opinión personal
  25. 25. Return o no return class UserKarma def reset # Do stuff total = 0 end end
  26. 26. Estructuras condicionales @user = nil if params[:id] @user = User.find(params[:id]) else @user = User.new end De “Ruby mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y-por-qu
  27. 27. Estructuras condicionales @user = if params[:id] User.find(params[:id]) else User.new end De “Ruby mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y-por-qu
  28. 28. Estructuras condicionales Operador ternario: @user = params[:id] ? User.find(params[:id]) : User.new De “Ruby mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y-por-qu
  29. 29. Estructuras condicionales if my_var return my_var else return another_value end http://www.zepho.com/download/ruby-idioms.pdf
  30. 30. Estructuras condicionales if my_var return my_var else return another_value end if my_var my_var else another_value end http://www.zepho.com/download/ruby-idioms.pdf
  31. 31. Estructuras condicionales if my_var return my_var else return another_value end if my_var my_var else another_value end my_var || another_value http://www.zepho.com/download/ruby-idioms.pdf
  32. 32. Asignaciones @post = Post.find(params[:id]) if @post @post.destroy end De “Ruby mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y-por-qu
  33. 33. Asignaciones @post = Post.find(params[:id]) if @post @post.destroy end if @post = Post.find(params[:id]) @post.destroy end De “Ruby mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y-por-qu
  34. 34. Asignaciones En paralelo: first, last, street = "Pi", "Filemon", "13 rue del percebe" # => ["Pi", "Filemon", "13 rue del percebe"] first, last = last, first # => ["Filemon", "Pi"]
  35. 35. Asignaciones @name = "Default name" unless @name http://www.zepho.com/download/ruby-idioms.pdf
  36. 36. Asignaciones @name = "Default name" unless @name @name ||= "Default name" http://www.zepho.com/download/ruby-idioms.pdf
  37. 37. Asignaciones Variaciones: a = 1 a += 1 a *= 5 # => 1 # => 2 # => 10 http://www.zepho.com/download/ruby-idioms.pdf
  38. 38. Clase Array (módulo enumerable) De “Ruby mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y-por-qu
  39. 39. Operaciones foo = [1, 2, 3] bar = [3, 4, 5] foo foo foo foo + * & | bar 2 bar bar # # # # => => => => [1, 2, 3, 3, 4, 5] [1, 2, 3, 1, 2, 3] [3] [1, 2, 3, 4, 5]
  40. 40. Iteradores - each foo.each do |item| puts item end foo.each{|item| puts item } # => [1, 2, 3]
  41. 41. Iteradores - map foo.map do |item| item*2 end foo.map{|item| item*2 } # => [2, 4, 6]
  42. 42. Iteradores - inject foo.inject do |sum, n| sum + n end foo.inject{|sum, n| sum + n } # => 6
  43. 43. Otros métodos [1, 1, 1, 2].uniq # => [1, 2] [1, [2, 3, [4]], 5].flatten # => [1, 2, 3, 4, 5] [nil, 1, nil, 2, 3].compact # => [1, 2, 3] [1, 2, 3].reverse # => [3, 2, 1] [2, 10, 1].sort # => [1, 2, 10]
  44. 44. Otros métodos [1, 2, 3, 4].find {|n| n % 3 == 0} # => 3 [1, 2, 3, 4].find_all {|n| n % 2 == 0} # => [2, 4]
  45. 45. Ejemplos prácticos De “Ruby mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y-por-qu
  46. 46. Ejemplo 1 ● Calcular el precio con IVA de la lista de precios: precios = [10, 12, 20, 50] pvp = [] precios.each do |precio| pvp << precio * 0.21 end pvp # => [2.1, 2.52, 4.2, 10.5]
  47. 47. Ejemplo 1 ● Calcular el precio con IVA de la lista de precios: precios = [10, 12, 20, 50] pvp = precios.map {|precio| precio * 0.21 }
  48. 48. Ejemplo 2 ● Calcula la suma total de una lista de precios: precios = [2.1, 2.52, 4.2, 10.5] total = 0 precios.each do |precio| total += precio end total # => 19.32
  49. 49. Ejemplo 2 ● Calcula la suma total de una lista de precios: precios = [2.1, 2.52, 4.2, 10.5] total = precios.inject{|sum, precio| sum + precio}
  50. 50. Clases y métodos
  51. 51. Clases y métodos ● Típica clase coche con su marca, modelo y color
  52. 52. Clases y métodos class Car def initialize(brand=nil, model=nil) @brand = brand @model = model end def brand @brand end def model @model end def color @color end def color=(new_color) @color = new_color end def brand=(new_brand) @brand = new_brand end def model=(new_model) @model= new_model end end
  53. 53. Clases y métodos class Car def initialize(brand=nil, model=nil) @brand = brand @model = model end ... end
  54. 54. Clases y métodos ... def color @color end def color=(new_color) @color = new_color end ... end
  55. 55. Clases y métodos class Car attr_accessor :brand, :model, :color def initialize(brand=nil, model=nil) @brand = brand @model = model end end
  56. 56. Clases y métodos Los métodos sus parámetros: ● Obligatorios ● Con valor por defecto ● Aceptar hashes, arrays y bloques
  57. 57. Clases y métodos Ejemplo de parámetro opcional: def foo(a=nil) # do someting end
  58. 58. Clases y métodos Ejemplo de parámetros obligatorios: def foo(a, b) # do someting end
  59. 59. Clases y métodos Ejemplo de parámetros obligatorios: def foo(a, b, *c) # do someting end
  60. 60. Clases y métodos Ejemplo de parámetros obligatorios: def foo(a, options={}) # do someting end
  61. 61. Clases y métodos Ejemplo: def foo(mandatory, value_not_needed=42, options={}) puts "#{mandatory} - #{value_not_needed}" puts "Options value: #{options}" unless options.empty? end
  62. 62. Muchas cosas quedan en el tintero :(
  63. 63. ¿Preguntas?
  64. 64. ¡Gracias! :)
  65. 65. Sobre mi Rafa García Ando por: - Twitter: @leptom - Email: contacto@rafagarcia.net - Github: rgo

×