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

Post on 20-Jun-2015

124 views 0 download

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 of ¿Por qué Ruby? Descubre su expresividad (y peculiaridades)

¿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! :)

Sobre miRafa García

Ando por:

- Twitter: @leptom

- Email: contacto@rafagarcia.net

- Github: rgo