O documento apresenta uma introdução à linguagem de programação Ruby, descrevendo sua história desde a criação em 1993, características como variáveis, métodos, classes, módulos e estruturas de controle, e exemplos de código.
5. Variáveis
a # escopo
@a # instância
$a # global
@@a # classe
a = 1
@a, $a, @@a = 2, 3, 4
a # => 1
@a # => 2
$a # => 3
@@a # => 4
6. Métodos
Declaração
def rua= (rua)
@rua = rua
end
def numero= (numero)
@numero = numero
end
def endereco
return "#{@rua}, #{@numero}"
end
7. Métodos
Utilização
rua=("Rua 5 de Abril")
numero=(321)
endereco() # => Rua 5 de Abril, 321
10.*(5) # => 50
8. Estruturas de Controle
if valor < 7
return "Reprovado" unless pessoas.empty?
else puts pessoas.size
return "Aprovado" end
end
return valor < 7 ? "Reprovado" : "Aprovado"
puts pessoas.size unless pessoas.empty?
9. Estruturas de Controle
def resultado(nota)
case nota
when (0..3); "Reprovado"
when (3..7); "Recuperação"
when (7..10); "Aprovado"
else raise "Nota inválida"
end
end
10. Estruturas de Controle
for numero in (1..3)
puts numero
end
(1..3).each do |numero|
puts numero
end
11. Classes
class Jogo
def self.atual # classe
# ...
end
def finalizar # instância
# ...
end
end
12. Módulos
module Time
class Jogador
end
end
module Calculadora
def media_aritmetica(valores = [])
if valores.size > 0
valores.sum / valores.size
end
end
end
13. Orientação a objetos
Em Ruby, não existem tipos primitivos.
Qualquer coisa é um objeto:
5.+(2) # => 7
Qualquer coisa mesmo!
foo = true
foo.nil? # => false
bar = nil
bar.nil? # => true
14. Flexibilidade
A linguagem não limita o programador.
Você pode adicionar funcionalidade, ou alterar o que já
existe!
class String
def carioqueish
"#{self}sh"
end
end
"Oi".carioqueish # => "Oish"
15. Paradigma Funcional
Por in!uência da linguagem Lisp, Ruby conta com
estruturas de blocos, que funcionam como closures.
a = lambda { "Sem Argumento" }
b = Proc.new do |args|
puts "Chamou b com: #{args}"
end
b.call("Argumento")
# => "Chamou b com: Argumento"
16. Alguns tipos de dados
Strings
v= 1
"V: #{v}" # => "V: 1"
'V: #{v}' # => "V: #{v}"
%(Teste de String) # => "Teste de String"
%w(Teste de String)
# => ["Teste", "de", "String"]
r = <<KEYWORD
Lorem ipsum dolor sit amet,
consectetur adipisicing elit
KEYWORD
17. Alguns tipos de dados
Arrays
a = Array.new
b = [3]
a << 1
a.push 2
a # => [1, 2]
a + b # => [1, 2, 3]
a.inject(:+) # => 3
18. Alguns tipos de dados
Arrays
telefones = pessoas.collect do |pessoa|
pessoa.telefone
end # Lista de telefones
menores = pessoas.select do |pessoa|
pessoa.idade < 18
end # Lista de pessoas
pessoas.select{|p| p.idade < 18}.collect{|p|
p.telefone} # Lista de telefones filtrada
19. Alguns tipos de dados
Hashes
hash = Hash.new
outro_hash = {}
hash[:valor] = 555
endereco = {:rua => "5 de Abril",
:numero => 321}
endereco[:rua] # => "5 de Abril"
endereco[:numero] # => 321
hash[:valor] # => 555
20. Syntax Sugar
Simpli"cando tanto a escrita, quanto a leitura.
1.+(1)
1+1
conta.valores=('teste')
conta.valores = 'teste'
conta.imprime_extrato()
conta.imprime_extrato
if (condicao)
if condicao
21. DRY
Don’t Repeat Yourself
Java
public class Endereco {
private String rua;
private Integer numero; Ruby
public String getRua() {
return rua;
class Endereco
}
public void setRua(String rua) { attr_writer :rua
this.rua = rua; attr_writer :numero
} attr_reader :rua
public Integer getNumero() {
attr_reader :numera
return numero;
} end
public void setNumero(Integer numero) {
this.numero = numero;
}
}
22. DRY
Don’t Repeat Yourself
Java
public class Endereco {
private String rua;
private Integer numero;
public String getRua() {
return rua; Ruby
}
public void setRua(String rua) { class Endereco
this.rua = rua;
}
attr_accessor :rua, :numero
public Integer getNumero() { end
return numero;
}
public void setNumero(Integer numero) {
this.numero = numero;
}
}
23. Não para por aí...
Mixins
Exceptions
Meta-programação
Threads
Implementações (JRuby, etc)