SlideShare uma empresa Scribd logo
1 de 49
Baixar para ler offline
CELTAB
Centro Latino-Americano
de Tecnologias Abertas
1
Ruby?!
2
3
4
● O que é o ruby?
● Onde e como nasceu?
● Para que serve?
5
Comparando ruby
com outras LPs
6
Versões de ruby
7
Ruby Version Manager
RVM é uma ferramenta de linha de comando
que permite instalar, gerenciar e trabalhar com
múltiplas versões de ruby e diversos conjuntos
de gems.
rvm.io
8
“Ruby está projetado para fazer os
programadores felizes.”
Yukihiro “Matz” Matsumoto - Criador do Ruby
9
Ruby
● Interpretada
● Totalmente Orientada a Objetos
● Dinâmica e fortemente Tipada
● Gramática complexa, mas expressiva
● Inspirada em Smalltalk, Lisp, Perl,
Ada, python...
10
➔ Programação OO
➔ Programação imperativa
➔ Programação Funcional
➔ Metaprogramação
➔ ...
O que podemos fazer?
11
➔ Gambiarras!
➔ Softwares
➔ Ferramentas
➔ Scripts
O que podemos construir?
12
Em ruby, tudo é objeto...
...sem exceções!
13
“[...] a não ser as variáveis...
… elas fazem referências a eles.”
14
Core Classes
➔ String
➔ Números
➔ Array
➔ Hash
➔ Symbol
➔ Boolean
➔ nil
➔ Range
➔ Regex
➔ Procs, blocks e lambdas
15
Types
value = 123 # => Fixnum
value = “1234” # => String
number = 1234
string = “I’m a string”
# Podemos somar ?
puts number + string
# => TypeError: String can't be coerced into Fixnum
16
Duck Typing
“Se anda como um pato e faz barulho como um pato,
então de deve ser um pato. E o interpretador ficará feliz
em fazer com que o objeto seja tratado como um pato. Na
prática, isso significa que em vez de fazer verificações de
tipo de um objeto, você deve se preocupar se este objeto
é capaz de executar o método que você precisa.”
- Nando Vieira
17
Duck Typing
class Marmot
def initialize(message)
@message = message
end
def quack
puts “Quack: #{@message}”
end
end
class Duck
def initialize
@name = “John Doe”
end
def quack
puts “Quack, my name is #{@name}”
end
end
duck_1 = Marmot.new “Marmots”
duck_2 = Duck.new
duck_1.quack # => “Quack: Marmots”
duck_2.quack # => “Quack, my name is John Doe”
18
Strings
message = “Galera!”
message_1 = ‘Hey’
message_1 + “, e” + “ ai ” + message
#=> “Hey, e ai Galera!”
ruby-doc.org/core-2.2.0/String.html19
Strings: Interpolação
message = “Galera!”
message_1 = ‘Hey’
“#{message_1}, e ai #{message}”
#=> “Hey, e ai Galera!”
“Agora somando #{3 + 5}”
#=> “Agora somando 8”
20
Números
21
Números
puts 1234 #=> 1234 - Base decimal, padrão
puts 0d1234 #=> 1234 - Base decimal, padrão
puts 1_234 #=> 1234 - Underscores são ignorados
puts -1234 #=> -1234 - Negativo
puts 0x4d2 #=> 1234 - Hexadecimal
puts 02322 #=> 1234 - Octal
puts 0b10011010010 #=> 1234 -Binário
puts 1.234 #=> 1.234
puts -1.234 #=> -1.234
puts 1_234.0 #=> 1234.0
puts 12e2 #=> 1200.0
puts 12.3e2 #=> 1230.0
puts 12.3E2 #=> 1230.0
22
Arrays
items = [ 1, "String", 1.0, [ 2, 3], nil ]
# => [ 1, “String”, 1.0, [ 2, 3], nil ]
puts [ "a", "a", "c" ] <=> [ "a", "b", "c" ] #=> -1
puts [ 1, 2, 3, 4, 5, 6 ] <=> [ 1, 2 ] #=> +1
items = Array.new
# => [ ]
items = Array.new([ 1, 2, 3 ])
# => [ 1, 2, 3 ]
words = %w[aa bb cc dd ee ff]
# => [ “aa”, “bb”, “cc”, “dd”, “ee”, “ff” ]
puts words[1]
# => “bb”
23
Hash
hash = { name: "John", last_name: "Doe", "zombie" => false, 'age' => '1e1'}
hash.each { |hash, value|
puts " ~> #{hash}(#{hash.class}) #{value}(#{value.class})"
}
# ~> name(Symbol) John(String)
# ~> last_name(Symbol) Doe(String)
# ~> zombie(String) false(FalseClass)
# ~> age(String) 1e1(String)
hash[:new_value] = { b: "something", 'another_value' => "something else" }
puts hash.inspect
# {:name=>"John", :last_name=>"Doe", "zombie"=>false, "age"=>"1e1", :
new_value=>{:b=>"something", "another_value"=>"something else"}}
24
Symbols
sym = :name
zombie = :"zombie"
to_sym = "john".to_sym
example = 'example'.intern
[sym, zombie, to_sym, example].each { |s|
puts "#{s}(#{s.class})"
}
# name(Symbol)
# zombie(Symbol)
# john(Symbol)
# example(Symbol)
25
Módulos
26
Classes
module Zombie
class Zombie
def initialize
@name = "John Doe"
@brains_eaten = 0
end
def tweet
"I want brains!"
end
def eat(n = 1)
@brains_eaten += n
end
def rooting
"Yeap"
end
def status
{ :status => "I just ate some delicious brains",
:zombie => @name }
end
end
end 27
Herança
Obs: ‘Não existe herança múltipla em ruby’
class Walker < Zombie
def walk
# do something
end
end
28
Mixins
module SuperHero
def super_powers
# Do something
end
end
module Fly
def fly
#Do something
end
end
class Goku
include SuperHero
include Fly
def saiyan
@@force *= :infinite
end
end
class Hulk
include SuperHero
def say_something_smart
"Hulk smash!"
end
end
29
Erros?
filename = 'testfile'
begin
# .. process
f = File.open('testfile')
rescue Exception => e
# .. handle error
filename = 'testfile.rb'
retry
ensure
f.close if f
end
30
➔ Condicionais (if, else, elseif, unless)
➔ Seletor Múltiplo (Case)
➔ Estruturas de repetição(for...in, while..
until, loop)
➔ Iteradores (Enumerator, Iterator)
➔ Closures
➔ Procs, blocks e Lambdas
➔ Variáveis (@@Classe, @instância)
➔ Constantes
➔ Monkey Patching e Refinements
31
32
33
SimpleDateFormat dtForm = new SimpleDateFormat("yyyy-MM-dd");
connection = GlobalConnector.getConnection();
StringBuffer sql = new StringBuffer("INSERT INTO conta (Numero,
Agencia, DataAdesao, DataEncerramento, ValorCorrenteTotalEmConta,
Cliente_id, TipoConta_id)");
sql.append(" VALUES(" + account.getAccountNumber() + ",'");
sql.append(account.getBankBranch() + "','");
sql.append(dtForm.format(account.getStartAccountDate()) + "','");
sql.append(dtForm.format(account.getClosingAccountDate()) + "','");
sql.append(account.getSaldoCorrente().toString() + "','");
sql.append(account.getClient().getIdClient() + "',");
sql.append(account.getTipo().getId() + ");");
connection.execute(sql);
connection.close();
34
@PersistenceContext(unitName = UNIT_NAME)
private EntityManager em;
private Class<T> entityClass;
public GenericDao(Class<T> entityClass) {
this.entityClass = entityClass;
}
public T save(T entity)
throws EntityExistsException, IllegalArgumentException, TransactionRequiredException
public void delete(Long id)
throws IllegalArgumentException, TransactionRequiredException
public T update(T entity)
throws IllegalArgumentException, TransactionRequiredException
public List<T> findAll()
throws IllegalStateException, QueryTimeoutException, TransactionRequiredException,
PessimisticLockException, LockTimeoutException, PersistenceException
35
@items = Item.all
@item = Item.find(params[:id])
@item = Item.new(item_params)
@item.save
@item.update_attributes(item_params)
@item.destroy
def item_params
params.require(:item).permit(:name, :quantity, :
useful_for, :category_id)
end
36
➔ PaaS
➔ Agilidade
➔ tempo x $$
➔ Cultura github
➔ Ecossistema
Rails para Startups
37
38
hotframeworks.com
39
Como continuar?
40
Try ruby!
tryruby.org
41
Como continuar?
codeschool.com/paths/ruby
42
github.com/markets/awesome-ruby
lista de 100+ ferramentas ruby para tudo!
43
github.com/bbatsov/ruby-style-guide
44
guides.rubyonrails.org/
45
46
47
kenner.hp@gmail.com
github.com/gnomex
@KennerKliemann
slideshare/kennerkliemann
br.linkedin.com/in/kennerkliemann
48
49

Mais conteúdo relacionado

Semelhante a Introdução ao Ruby - Linguagem, Conceitos e Aplicações

Ruby para-programadores-php
Ruby para-programadores-phpRuby para-programadores-php
Ruby para-programadores-phpJuan Maiz
 
O que você NÃO aprendeu sobre Programação Orientada a Objetos
O que você NÃO aprendeu sobre Programação Orientada a ObjetosO que você NÃO aprendeu sobre Programação Orientada a Objetos
O que você NÃO aprendeu sobre Programação Orientada a ObjetosDanilo Sato
 
Ruby on rails gds 2011
Ruby on rails   gds 2011Ruby on rails   gds 2011
Ruby on rails gds 2011JogosUnisinos
 
Python em (mais de) 10 minutinhos
Python em (mais de) 10 minutinhosPython em (mais de) 10 minutinhos
Python em (mais de) 10 minutinhosRudá Moura
 
Ruby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosRuby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosGregorio Kusowski
 
Perl Moderno, dia1
Perl Moderno, dia1Perl Moderno, dia1
Perl Moderno, dia1garux
 
Introdução ao Ruby
Introdução ao RubyIntrodução ao Ruby
Introdução ao RubyMilton Moura
 
Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)Hugo Maia Vieira
 
Introdução à Programação em Python
Introdução à Programação em PythonIntrodução à Programação em Python
Introdução à Programação em PythonRodrigo Hübner
 
Crash Course Ruby & Rails
Crash Course Ruby & RailsCrash Course Ruby & Rails
Crash Course Ruby & RailsFrevo on Rails
 
Objetos Pythonicos - compacto
Objetos Pythonicos - compactoObjetos Pythonicos - compacto
Objetos Pythonicos - compactoLuciano Ramalho
 
Arduino e Python: Do It Yourself
Arduino e Python: Do It YourselfArduino e Python: Do It Yourself
Arduino e Python: Do It YourselfBruno Nascimento
 

Semelhante a Introdução ao Ruby - Linguagem, Conceitos e Aplicações (17)

Ruby para-programadores-php
Ruby para-programadores-phpRuby para-programadores-php
Ruby para-programadores-php
 
O que você NÃO aprendeu sobre Programação Orientada a Objetos
O que você NÃO aprendeu sobre Programação Orientada a ObjetosO que você NÃO aprendeu sobre Programação Orientada a Objetos
O que você NÃO aprendeu sobre Programação Orientada a Objetos
 
Ruby on rails gds 2011
Ruby on rails   gds 2011Ruby on rails   gds 2011
Ruby on rails gds 2011
 
Python em (mais de) 10 minutinhos
Python em (mais de) 10 minutinhosPython em (mais de) 10 minutinhos
Python em (mais de) 10 minutinhos
 
Ruby learning
Ruby learningRuby learning
Ruby learning
 
Ruby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosRuby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanos
 
Ruby
RubyRuby
Ruby
 
Ruby (1)
Ruby (1)Ruby (1)
Ruby (1)
 
Perl Moderno, dia1
Perl Moderno, dia1Perl Moderno, dia1
Perl Moderno, dia1
 
Introdução ao Ruby
Introdução ao RubyIntrodução ao Ruby
Introdução ao Ruby
 
Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)
 
Introdução à Programação em Python
Introdução à Programação em PythonIntrodução à Programação em Python
Introdução à Programação em Python
 
Crash Course Ruby & Rails
Crash Course Ruby & RailsCrash Course Ruby & Rails
Crash Course Ruby & Rails
 
Ecossistema Python
Ecossistema PythonEcossistema Python
Ecossistema Python
 
Objetos Pythonicos - compacto
Objetos Pythonicos - compactoObjetos Pythonicos - compacto
Objetos Pythonicos - compacto
 
Object Oriented Programming
Object Oriented ProgrammingObject Oriented Programming
Object Oriented Programming
 
Arduino e Python: Do It Yourself
Arduino e Python: Do It YourselfArduino e Python: Do It Yourself
Arduino e Python: Do It Yourself
 

Introdução ao Ruby - Linguagem, Conceitos e Aplicações

  • 3. 3
  • 4. 4
  • 5. ● O que é o ruby? ● Onde e como nasceu? ● Para que serve? 5
  • 8. Ruby Version Manager RVM é uma ferramenta de linha de comando que permite instalar, gerenciar e trabalhar com múltiplas versões de ruby e diversos conjuntos de gems. rvm.io 8
  • 9. “Ruby está projetado para fazer os programadores felizes.” Yukihiro “Matz” Matsumoto - Criador do Ruby 9
  • 10. Ruby ● Interpretada ● Totalmente Orientada a Objetos ● Dinâmica e fortemente Tipada ● Gramática complexa, mas expressiva ● Inspirada em Smalltalk, Lisp, Perl, Ada, python... 10
  • 11. ➔ Programação OO ➔ Programação imperativa ➔ Programação Funcional ➔ Metaprogramação ➔ ... O que podemos fazer? 11
  • 12. ➔ Gambiarras! ➔ Softwares ➔ Ferramentas ➔ Scripts O que podemos construir? 12
  • 13. Em ruby, tudo é objeto... ...sem exceções! 13
  • 14. “[...] a não ser as variáveis... … elas fazem referências a eles.” 14
  • 15. Core Classes ➔ String ➔ Números ➔ Array ➔ Hash ➔ Symbol ➔ Boolean ➔ nil ➔ Range ➔ Regex ➔ Procs, blocks e lambdas 15
  • 16. Types value = 123 # => Fixnum value = “1234” # => String number = 1234 string = “I’m a string” # Podemos somar ? puts number + string # => TypeError: String can't be coerced into Fixnum 16
  • 17. Duck Typing “Se anda como um pato e faz barulho como um pato, então de deve ser um pato. E o interpretador ficará feliz em fazer com que o objeto seja tratado como um pato. Na prática, isso significa que em vez de fazer verificações de tipo de um objeto, você deve se preocupar se este objeto é capaz de executar o método que você precisa.” - Nando Vieira 17
  • 18. Duck Typing class Marmot def initialize(message) @message = message end def quack puts “Quack: #{@message}” end end class Duck def initialize @name = “John Doe” end def quack puts “Quack, my name is #{@name}” end end duck_1 = Marmot.new “Marmots” duck_2 = Duck.new duck_1.quack # => “Quack: Marmots” duck_2.quack # => “Quack, my name is John Doe” 18
  • 19. Strings message = “Galera!” message_1 = ‘Hey’ message_1 + “, e” + “ ai ” + message #=> “Hey, e ai Galera!” ruby-doc.org/core-2.2.0/String.html19
  • 20. Strings: Interpolação message = “Galera!” message_1 = ‘Hey’ “#{message_1}, e ai #{message}” #=> “Hey, e ai Galera!” “Agora somando #{3 + 5}” #=> “Agora somando 8” 20
  • 22. Números puts 1234 #=> 1234 - Base decimal, padrão puts 0d1234 #=> 1234 - Base decimal, padrão puts 1_234 #=> 1234 - Underscores são ignorados puts -1234 #=> -1234 - Negativo puts 0x4d2 #=> 1234 - Hexadecimal puts 02322 #=> 1234 - Octal puts 0b10011010010 #=> 1234 -Binário puts 1.234 #=> 1.234 puts -1.234 #=> -1.234 puts 1_234.0 #=> 1234.0 puts 12e2 #=> 1200.0 puts 12.3e2 #=> 1230.0 puts 12.3E2 #=> 1230.0 22
  • 23. Arrays items = [ 1, "String", 1.0, [ 2, 3], nil ] # => [ 1, “String”, 1.0, [ 2, 3], nil ] puts [ "a", "a", "c" ] <=> [ "a", "b", "c" ] #=> -1 puts [ 1, 2, 3, 4, 5, 6 ] <=> [ 1, 2 ] #=> +1 items = Array.new # => [ ] items = Array.new([ 1, 2, 3 ]) # => [ 1, 2, 3 ] words = %w[aa bb cc dd ee ff] # => [ “aa”, “bb”, “cc”, “dd”, “ee”, “ff” ] puts words[1] # => “bb” 23
  • 24. Hash hash = { name: "John", last_name: "Doe", "zombie" => false, 'age' => '1e1'} hash.each { |hash, value| puts " ~> #{hash}(#{hash.class}) #{value}(#{value.class})" } # ~> name(Symbol) John(String) # ~> last_name(Symbol) Doe(String) # ~> zombie(String) false(FalseClass) # ~> age(String) 1e1(String) hash[:new_value] = { b: "something", 'another_value' => "something else" } puts hash.inspect # {:name=>"John", :last_name=>"Doe", "zombie"=>false, "age"=>"1e1", : new_value=>{:b=>"something", "another_value"=>"something else"}} 24
  • 25. Symbols sym = :name zombie = :"zombie" to_sym = "john".to_sym example = 'example'.intern [sym, zombie, to_sym, example].each { |s| puts "#{s}(#{s.class})" } # name(Symbol) # zombie(Symbol) # john(Symbol) # example(Symbol) 25
  • 27. Classes module Zombie class Zombie def initialize @name = "John Doe" @brains_eaten = 0 end def tweet "I want brains!" end def eat(n = 1) @brains_eaten += n end def rooting "Yeap" end def status { :status => "I just ate some delicious brains", :zombie => @name } end end end 27
  • 28. Herança Obs: ‘Não existe herança múltipla em ruby’ class Walker < Zombie def walk # do something end end 28
  • 29. Mixins module SuperHero def super_powers # Do something end end module Fly def fly #Do something end end class Goku include SuperHero include Fly def saiyan @@force *= :infinite end end class Hulk include SuperHero def say_something_smart "Hulk smash!" end end 29
  • 30. Erros? filename = 'testfile' begin # .. process f = File.open('testfile') rescue Exception => e # .. handle error filename = 'testfile.rb' retry ensure f.close if f end 30
  • 31. ➔ Condicionais (if, else, elseif, unless) ➔ Seletor Múltiplo (Case) ➔ Estruturas de repetição(for...in, while.. until, loop) ➔ Iteradores (Enumerator, Iterator) ➔ Closures ➔ Procs, blocks e Lambdas ➔ Variáveis (@@Classe, @instância) ➔ Constantes ➔ Monkey Patching e Refinements 31
  • 32. 32
  • 33. 33
  • 34. SimpleDateFormat dtForm = new SimpleDateFormat("yyyy-MM-dd"); connection = GlobalConnector.getConnection(); StringBuffer sql = new StringBuffer("INSERT INTO conta (Numero, Agencia, DataAdesao, DataEncerramento, ValorCorrenteTotalEmConta, Cliente_id, TipoConta_id)"); sql.append(" VALUES(" + account.getAccountNumber() + ",'"); sql.append(account.getBankBranch() + "','"); sql.append(dtForm.format(account.getStartAccountDate()) + "','"); sql.append(dtForm.format(account.getClosingAccountDate()) + "','"); sql.append(account.getSaldoCorrente().toString() + "','"); sql.append(account.getClient().getIdClient() + "',"); sql.append(account.getTipo().getId() + ");"); connection.execute(sql); connection.close(); 34
  • 35. @PersistenceContext(unitName = UNIT_NAME) private EntityManager em; private Class<T> entityClass; public GenericDao(Class<T> entityClass) { this.entityClass = entityClass; } public T save(T entity) throws EntityExistsException, IllegalArgumentException, TransactionRequiredException public void delete(Long id) throws IllegalArgumentException, TransactionRequiredException public T update(T entity) throws IllegalArgumentException, TransactionRequiredException public List<T> findAll() throws IllegalStateException, QueryTimeoutException, TransactionRequiredException, PessimisticLockException, LockTimeoutException, PersistenceException 35
  • 36. @items = Item.all @item = Item.find(params[:id]) @item = Item.new(item_params) @item.save @item.update_attributes(item_params) @item.destroy def item_params params.require(:item).permit(:name, :quantity, : useful_for, :category_id) end 36
  • 37. ➔ PaaS ➔ Agilidade ➔ tempo x $$ ➔ Cultura github ➔ Ecossistema Rails para Startups 37
  • 38. 38
  • 43. github.com/markets/awesome-ruby lista de 100+ ferramentas ruby para tudo! 43
  • 46. 46
  • 47. 47
  • 49. 49