¿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
of 65

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

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 on: Mar 4, 2016
Published in: Technology      
Source: www.slideshare.net


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

  • 1. ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)
  • 2. Sobre mi (muy brevemente)
  • 3. Ruby idiomatico
  • 4. ¿idiomatico?
  • 5. Ruby Yukihiro Matsumoto “Matz”
  • 6. Ruby ● Orientado a objetos ● Interpretado ● (Muy) Dinámico ● Alto nivel ● Basado en Perl, Smalltalk, Lisp, C, ... ● Metaprogramación ● ….
  • 7. Ruby ● Orientado a objetos ● Interpretado ● (Muy) Dinámico ● Alto nivel ● Basado en Perl, Smalltalk, Lisp, C, ... ● Metaprogramación ● ….
  • 8. Ruby ● Cercano al lenguaje natural ● Fácil de leer y escribir ● Eficiente ● ¡DIVERTIDO! :-)))
  • 9. ¿Paréntesis? puts(“¿Los ponemos co?”)
  • 10. ¿Paréntesis? puts “No es necesario”
  • 11. Orientado a objetos (de verdad de la buena)
  • 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. Orientado a objetos "zARAGOZA-rb".swapcase # => "Zaragoza-RB" -12345.abs # => 12345 5 * 10 # => 50
  • 14. Orientado a objetos "zARAGOZA-rb".swapcase # => "Zaragoza-RB" -12345.abs # => 12345 5 * 10 # => 50 5.*(10) # => Syntactic sugar
  • 15. Orientado a objetos Time.now Time.now.thursday? # => 2013-06-27... # => true 2013.even? 5.times{ puts "DRY" } # => false # => 5
  • 16. Orientado a objetos "DAba Le ArrOz Al A ZoRrA ELaBAd".downcase.reverse # => "dabale arroz a la zorra el abad"
  • 17. True / nil / false if 0 "0 es verdadero" else "0 es falso" end
  • 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. If / unless if !order.valid? order.block end
  • 20. If / unless if !order.valid? order.block end order.block unless order.valid?
  • 21. ¿¡ Exclamaciones e interrogaciones en métodos !?
  • 22. Convenio Interrogación retorna booleano [1, 2, 3, 5].empty? # => false
  • 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. Return o no return ● Cualquier expresión retorna un valor ● Rara vez usas return* * Es una opinión personal
  • 25. Return o no return class UserKarma def reset # Do stuff total = 0 end end
  • 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. 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. 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. Estructuras condicionales if my_var return my_var else return another_value end http://www.zepho.com/download/ruby-idioms.pdf
  • 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. 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. 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. 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. 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. Asignaciones @name = "Default name" unless @name http://www.zepho.com/download/ruby-idioms.pdf
  • 36. Asignaciones @name = "Default name" unless @name @name ||= "Default name" http://www.zepho.com/download/ruby-idioms.pdf
  • 37. Asignaciones Variaciones: a = 1 a += 1 a *= 5 # => 1 # => 2 # => 10 http://www.zepho.com/download/ruby-idioms.pdf
  • 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. 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. Iteradores - each foo.each do |item| puts item end foo.each{|item| puts item } # => [1, 2, 3]
  • 41. Iteradores - map foo.map do |item| item*2 end foo.map{|item| item*2 } # => [2, 4, 6]
  • 42. Iteradores - inject foo.inject do |sum, n| sum + n end foo.inject{|sum, n| sum + n } # => 6
  • 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. 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. Ejemplos prácticos De “Ruby mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y-por-qu
  • 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. 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. 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. 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. Clases y métodos
  • 51. Clases y métodos ● Típica clase coche con su marca, modelo y color
  • 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. Clases y métodos class Car def initialize(brand=nil, model=nil) @brand = brand @model = model end ... end
  • 54. Clases y métodos ... def color @color end def color=(new_color) @color = new_color end ... end
  • 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. Clases y métodos Los métodos sus parámetros: ● Obligatorios ● Con valor por defecto ● Aceptar hashes, arrays y bloques
  • 57. Clases y métodos Ejemplo de parámetro opcional: def foo(a=nil) # do someting end
  • 58. Clases y métodos Ejemplo de parámetros obligatorios: def foo(a, b) # do someting end
  • 59. Clases y métodos Ejemplo de parámetros obligatorios: def foo(a, b, *c) # do someting end
  • 60. Clases y métodos Ejemplo de parámetros obligatorios: def foo(a, options={}) # do someting end
  • 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. Muchas cosas quedan en el tintero :(
  • 63. ¿Preguntas?
  • 64. ¡Gracias! :)
  • 65. Sobre mi Rafa García Ando por: - Twitter: @leptom - Email: contacto@rafagarcia.net - Github: rgo

Related Documents