¿por qué ruby? descubre su expresividad (y peculiaridades)
DESCRIPTION
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.TRANSCRIPT
¿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! :)