Quem sou eu?
Daniel Coelho de Andrade
Graduando em Engenharia de Computação - UEFS
Membro da Empresa Júnior de Engenharia de Computação da UEFS
“Ruby”?
● Linguagem dinâmica● Foco na simplicidade e produtividade● Leitura natural● Multiparadigma e propósito geral● Scripts● Interpretada
Um pouco de história...
● Criador: Yukihiro Matsumoto - “Matz”
● Primeira versão estável: 1996
● Versão atual (estável): 2.2.0
“Ruby is simple in appearance, but is very complex inside, just like the human body” – Matz
...mais uma linguagem?
● Matz queria uma linguagem que...– Fosse mais poderosa que o Pearl– Mais orientada a objetos que Python– Simples como o Lisp
“Por que aprender Ruby?”
codeeval.com - 2014
“Mas Ruby é lento...”
Fonte: programmingzen.com/?s=benchmark
Fonte: bjpelc.wordpress.com
Está melhorando muito!
“Quero saber quem é que usa isso aí”
Esse são só alguns...
Então...
Porque programar em Ruby?
● Fácil leitura● Foco na simplicidade e produtividade● Comunidade● Desenvolvimento Ágil (Framework Rails)● Sempre tem mais de um jeito de fazer a
mesma coisa● É divertido :)
Além disso...
Interactive Ruby Shell
RubyGems
#gem install sqlite3
Só mais uma coisa...
Ruby is evil
“O Ruby é mal. Muito mal. Mas por que é tão mal? Porque é tão bonito. A sintaxe é tão elegante, tudo é objeto, tudo faz sentido. O jeito Ruby de fazer as coisas é tão atraente...”
Simon Eskildsen
Responsável pela infraestrutura do Shopify
“Sim, tá falando demais”
Ok, chega. Vamos programar!
“Mas espera, como instala isso aí?”
No Windows
● Faça o download do executável em http://rubyinstaller.org/
● Instale
No Linux
● Distribuições baseadas no Red Hat– sudo yum install ruby irb rubygems
● Distribuições baseadas no Debian– sudo apt-get install ruby irb rubygems
“O que vamos usar para programar em Ruby?”
Ferramentas
● IRB
● Terminal
● Um editor de texto
“Como abro o IRB?”
Fácil!
● Abra o Terminal(ctrl+alt+t)
● Digite irb
Tradições...
No IRB...
puts “Hello, World!”
print “Hello, World!”
p “Hello, World!”
Comentários
Variáveis
Não precisa declará-las
O Ruby é dinâmico!
“Não entendi o 'dinâmico'...”
Vamos entender na a prática então
No IRB...
“E se eu quiser imprimir uma variável junto a um texto?”
Simples, é só interpolar
Exemplo
numero = 42
puts “Eu escolhi o número #{numero}”
Sua vez
Escolha um número qualquer, atribua ele a uma variável e imprima a mensagem “O
número (seu número) foi escolhido por mim”
“nil?”
Convenções
● CONSTANTE
● variavelComMaisDeUmNome
Vamos para algo um pouco mais interessante...
Strings
Strings
● Array de sequência de bytes
● “String” é diferente de 'String'
● “a” é uma String– Não existem caracteres
Lidando com Strings
● nome.upcase● nome.downcase● nome.capitalize● nome.swapcase● nome.reverse● Vários outros...
Sim, parênteses são opcionais!
Voltando...
Transformando Strings
Strings são mutáveis
“Sempre existe mais de um jeito de fazer a mesma coisa”
Jeito “comum”
nome=nome.capitalize
Jeito Ruby
nome.capitalize!
“O “!” funciona pra qualquer método?”
“Como leio dados do teclado?”
Fácil!
● gets
● gets.chomp
“Tá ficando chato fazer isso no Shell...”
“Como crio arquivos executáveis em Ruby?”
Criando, Editando e Executando
● Arquivo de texto com extensão .rb
● ruby seuarquivo.rb
Para fixar o conhecimento...
Faça um programa que leia uma string e imprima essa string ao contrário.
Fluxo de Controle
Comparando com C e Java...
● else if = elsif
● Sem chaves obrigatórias
● O bloco é finalizado com a palavra end
Operadores lógicos
● || ou or = ou
● and ou && = e
● not = negação
Exemplo
Escrito de outro jeito...
Compactando
Exercício para fixar a sintaxe :)
Um programa que lê uma string digitada pelo usuário e substitui todas letras “a” por um “-”
Alguma sugestão de como fazer?
Vamos tentar de novo...
gsub(“a”, “b”)
include?()
Agora sim!
Um programa que lê uma string digitada pelo usuário e substitui todas letras “a” por um “-”
Loops e Iteradores
While
x++? não
x+=1
For
1..5? Intervalos!
● 1..5 = 1,2,3,4,5● 1...5 = 1,2,3,4
● Também funciona com letras!
“Jeito Ruby de fazer as coisas...”
Until
.times
.upto
.downto
Antes de falarmos sobre Iteradores...
Arrays
Instanciando
● array = []
● array = Array.new
● array=Array.new(tamanho)
● array=Array.new(tamanho, elemento)
Acessando os elementos
● Index [x]● Intervalos [x..y] ou [x...y]● array.first● array.last● array.take(n)● array.length● array.include?
Adicionando elementos
● array.push(dado)● array << dado● array.insert(posição, dado)
Removendo elementos
● array.delete● array.delete_at(posicao)● array.pop
Soma e Subtração
“E lista?”
Lista == Array
Agora sim, Iterando em Arrays
Each
array.each{|variavel| comandos}
array.each do |variavel|
comandos
end
Ou..
“Quer dizer que Ruby aceita blocos de comando como parâmetro?”
“Qual a diferença entre o uso das chaves e do 'do...end'?”
Selecionando itens do Array
O problema
Eu tenho um array de strings e quero imprimir somente as strings que começam com vogais,
como faço?
Alguma ideia?
A solução
string.select
array.include?
Definindo suas funções
Corpo de uma função em Ruby
Detalhes...
Em Ruby, toda função retorna um valor
Voltando um pouco...
“Sim, mas o que é esse nil?”
Qual o retorno desse método?
Retorno explícito
Retorno implícito
Convenções
● Se a função retorna true/false, termina em ?
● Se o a função tiver nome composto, separa-os por _
Exemplos
● e_par?● e_impar?● mais_uma_funcao
“Como é aquela coisa de passar blocos como parâmetro?”
yield
Qual a saída desse código?
Pra fixar o conhecimento...
● Faça uma função que aceite um array como parâmetro e, quando dado um bloco, imprima cada um dos elementos do array.
Dicas: Para passar um array como parâmetro usa um * antes do nome da variável. Para verificar se foi
passado um bloco como parâmetro, use a função block_given?
Perguntas?
Próximos tópicos
● POO com Ruby
● Metaprogramação
● Rails
Iniciando com o básico...
Definindo uma classe
Instanciando uma Classe
Observações
● Nome de classe inicia sempre com letra maíuscula
● ClasseComMaisDeUmNome
Antes de continuar vamos ver algumas coisas...
Tudo é objeto
Até as classes são objetos!
As classes são abertas
“Classes abertas???”
Vamos mostrar isso na prática :)
Redefinindo a Classe Class
Live Coding
Isso é chamado de Metaprogramação
“Se tudo é objeto, o que acontece numa expressão do tipo x = 2+2?”
x= 2+ 2
x= 2+ 2
Chamada de método 1
Chamada de método 2
x= 2+ 2
Parâmetro do método 1
Parâmetro do método 2
Lembra? Parênteses são opcionais!
Rearranjando...
x=(2+(2))
x=(4)
“Mas como assim '+' e '=' são métodos?”
Syntax Sugar
Poetry Mode
Fonte: courses.edx.org
“Como posso ver todos os métodos dessas classes?”
ruby-doc.org
.methods
.respond_to?(:nomeDoMetodo)
Níveis de acesso das variáveis
● $var -> Variável global
● @var -> Variável de instância (atributo)
● @@var -> Variável de classe
Todos os atributos são privados
Métodos
● São públicos por padrão
● São divididos em seções de visibilidade
● Ruby não suporta sobrecarga de métodos
Parâmetros opcionais
Chamada sem parâmetro
Chamada com parâmetro
Métodos de Classe
Definindo
Acessando
Convenções sobre métodos
● metodo_com_mais_de_um_nome
● Atribuicao=
● retorno_booleano?
Construindo uma classe simples
Atribuição Condicional
Como você faria os métodos para alterar o endereco de uma pessoa?
“Jeito Ruby”
Código gerado na classe
“E se eu quiser só ler ou alterar o atributo?”
Equivale a
Exercício para fixar a sintaxe
● Classe Telefone(numero:String, crédito:inteiro)● Métodos
– Ligar(número:String) [Desconta 5 créditos por ligação)
– Adicionar créditos
– Total de Telefones [Retorna o total de telefones]
● Obs: Se não for passado um valor, os créditos iniciam em quantidade igual a 50.
● Obs²: A ligação só pode ser feita se os créditos forem suficientes
“Ok. Como faço uma classe herdar de outra?”
Observações sobre Herança
● Ruby não suporta herança múltipla
● Simula herança múltipla por mixins
Antes do mixin propriamente dito...
Modules
Maneira de agrupar métodos, variáveis e constantes
Include vs Require
Mixin é o resultado da inclusão de um module em uma classe.
“Como importo classes em outros arquivos .rb?”
require_relative “caminho/para/arquivo”
Outro exercício
● Crie um Module chamado Motor e uma classe chamada Veículo. Em module, defina os métodos “Ligar” e “Desligar”, que devem imprimir “Motor ligado” e “Motor ligado”, respectivamente. Faça um mixin com a classe Veiculo e o Module Motor.
Mais metaprogramação!
Criando métodos que criam métodos
Temos uma classe professor e temos uma classe aluno. Como fazemos para o professor
ensinar ao aluno a escrever?
Primeiro passo: Classe Aluno
Segundo passo: Classe Professor
Terceiro passo: Classe Aula
Fonte do Exercício: Caelum
Exercício
Crie uma classe Superman e uma classe Pessoa. Faça com que Superman ensina uma
pessoa a voar numa Aula. Superman, Pessoa e Aula devem estar em arquivos separados.
Desvantagens do Ruby
● Ainda é considerado lento
● Pouco material disponível comercialmente
● Codificação única
Com Ruby, evite:
● Aplicações com processamento tempo real
● Aplicações que exigem muito processamento
Perguntas?
Onde encontrar mais:
● Ruby-lang.org● Manual Ruby TAC● Sirupsen.com – Simon Eskildsen● Akita On Rails – Fábio Akita● Caelum
Isso é tudo, Obrigado :)