¿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, ...● Metaprogramación● ….
Ruby● Orientado a objetos● Interpretado● (Muy) Dinámico● Alto nivel● Basado en Perl, Smalltalk, Lisp, C, ...● Metaprogramación● ….
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 # => String
42.class # => Fixnum
nil.class # => NilClass
[1, 2, 3].class # => Array
(1..9).class # => Range
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) # => Syntactic sugar
Orientado a objetosTime.now # => 2013-06-27...
Time.now.thursday? # => true
2013.even? # => false
5.times{ puts "DRY" } # => 5
Orientado a objetos
"DAba Le ArrOz Al A ZoRrA ELaBAd".downcase.reverse
# => "dabale arroz a la zorra el abad"
True / nil / falseif 0
"0 es verdadero"
else
"0 es falso"
end
True / nil / falseif 0
"0 es verdadero"
else
"0 es falso"
end # => "0 es verdadero"
Todo es true excepto nil y false
If / unlessif !order.valid?
order.block
end
If / unlessif !order.valid?
order.block
end
order.block unless order.valid?
¿¡ Exclamaciones e interrogaciones en
métodos !?
ConvenioInterrogación retorna booleano
[1, 2, 3, 5].empty? # => false
ConvenioExclamación acción destructiva
array = [1, 2, 3] # => [1, 2, 3]
array.reverse # => [3, 2, 1]
array # => [1, 2, 3]
array = [1, 2, 3] # => [1, 2, 3]
array.reverse! # => [3, 2, 1]
array # => [3, 2, 1]
Return o no return● Cualquier expresión retorna un valor● Rara vez usas return*
* Es una opinión personal
Return o no returnclass 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 mola y por qué” de Sergio Gil - http://www.slideshare.net/sergio.gil/ruby-mola-y-por-qu
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
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
Estructuras condicionales
if my_var
return my_var
else
return another_value
end
http://www.zepho.com/download/ruby-idioms.pdf
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
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
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
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
AsignacionesEn paralelo:
first, last, street = "Pi", "Filemon", "13 rue del percebe"
# => ["Pi", "Filemon", "13 rue del percebe"]
first, last = last, first
# => ["Filemon", "Pi"]
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
AsignacionesVariaciones:
a = 1 # => 1
a += 1 # => 2
a *= 5 # => 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-por-qu
Operacionesfoo = [1, 2, 3]
bar = [3, 4, 5]
foo + bar # => [1, 2, 3, 3, 4, 5]
foo * 2 # => [1, 2, 3, 1, 2, 3]
foo & bar # => [3]
foo | bar # => [1, 2, 3, 4, 5]
Iteradores - eachfoo.each do |item|
puts item
end
foo.each{|item| puts item } # => [1, 2, 3]
Iteradores - mapfoo.map do |item|
item*2
end
foo.map{|item| item*2 } # => [2, 4, 6]
Iteradores - injectfoo.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 # => [1, 2, 3]
[1, 2, 3].reverse # => [3, 2, 1]
[2, 10, 1].sort # => [1, 2, 10]
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 |precio|
pvp << precio * 0.21
end
pvp # => [2.1, 2.52, 4.2, 10.5]
Ejemplo 1● Calcular el precio con IVA de la lista de
precios:
precios = [10, 12, 20, 50]
pvp = precios.map {|precio| precio * 0.21 }
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
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}
Clases y métodos
Clases y métodos
● Típica clase coche con su marca, modelo y color
Clases y métodosclass 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
Clases y métodosclass 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étodosclass Car
attr_accessor :brand, :model, :color
def initialize(brand=nil, model=nil)
@brand = brand
@model = model
end
end
Clases y métodosLos métodos sus parámetros:
● Obligatorios● Con valor por defecto● Aceptar hashes, arrays y bloques
Clases y métodosEjemplo de parámetro opcional:
def foo(a=nil)
# do someting
end
Clases y métodosEjemplo de parámetros obligatorios:
def foo(a, b)
# do someting
end
Clases y métodosEjemplo de parámetros obligatorios:
def foo(a, b, *c)
# do someting
end
Clases y métodosEjemplo de parámetros obligatorios:
def foo(a, options={})
# do someting
end
Clases y métodosEjemplo:
def foo(mandatory, value_not_needed=42, options={})
puts "#{mandatory} - #{value_not_needed}"
puts "Options value: #{options}" unless options.empty?
end
Muchas cosas quedanen el tintero :(
¿Preguntas?
¡Gracias! :)