Escolar Documentos
Profissional Documentos
Cultura Documentos
Recursos de Ruby
● Ruby tem uma sintaxe simples, parcialmente inspirada por Eiffel e Ada.
● Ruby tem recursos de tratamento de exceções
● Os operadores do Ruby são açucar sintático para os métodos. Você pode
redefini-los facilmente.
● Ruby é uma linguagem completa e puramente orientada á objetos. Isso
significa que todo dado em Ruby é um objeto. Por exemplo, em Ruby, o
numero 1 é uma instância da classe Fixnum.
O que
O que é Ruby?
é Ruby?
{ |<parametros>| <código>}
do |<parametros>|
<código>
end
Conhecendo
Conhecendo o básico
Blocos de código Iterators
(0..5).each
{ {|p| puts
|<parametros>| “o parâmetro vale o#{p}”
<código>} parâmetro
} vale 0
-----------------------------
o parâmetro vale 1
o parâmetro vale 0
-----------------------------
Blocos de várias linhas: o parâmetro
o parâmetro vale
vale1 2
o parâmetro vale 2
-----------------------------
o parâmetro
o parâmetro vale
vale3 3
(0..5).each
do do |p|
|<parametros>| o parâmetro vale 4
puts “o parâmetro vale #{p}” -----------------------------
<código> o parâmetro vale 5 4
o parâmetro vale
endputs “----------------------------------” -----------------------------
end o parâmetro vale 5
-----------------------------
Conhecendo
Conhecendo o básico
Números
Fixnum's
Bignum's e Floats
Bignum Float
b = (2**40) (2**40) 123.45
b.class => Bignum
Garbage Collector
f = 123.45
f.class => Float
Fixnum Float Bignum
Const = “constante”
t = true
Const = “constante”
t.class => TrueClass
warning: already initialized constant Const
f = false
f.class => FalseClass
n = nil
n.class => NilClass
Conhecendo
Conhecendo o básico
Strings e símbolos
s1 = “taq” String
“taq”
s2 = s1 String
“taq”
s3 = “taq”
Symbol
taq
s4 = :taq
r = 0..5 a = [1,”dois”,3,”quatro”,5]
r.each {|p| print “#{p},”} a.each {|p| print “e:#{p},”}
0,1,2,3,4,5 e:1,e:dois,e:3,e:quatro,e:5,
r = 0...5
r.each {|p| print “#{p},”}
0,1,2,3,4 h = {20=>”vinte”,30=>30.0}
a.each_key {|p| print “e:#{p},”}
e:30,e:20
a.each_value {|p| print “e:#{p},”}
e:30.0,e:vinte
Conhecendo
Conhecendo o básico
Expressões regulares
er = /[0-9]/
er = Regexp.new(“[0-9]”)
a = []
a << Carro.new("azul") azul
a << Carro.new("branco") ----------------------
a.each do |p| branco
puts p.cor
puts "----------------------"
----------------------
end 2
puts Carro.fabricados
Conhecendo
Conhecendo o básico
Classes
class Carro class Carro
attr_accessor :cor attr_accessor :cor # leitura e escrita
@@fabricados = 0 attr_reader :odometro # leitura
def initialize(cor) attr_writer :senha # escrita
@cor = cor
@@fabricados += 1 def initialize(cor)
end @cor = cor
def Carro.fabricados @odometro = 0
@@fabricados @senha = “123456”
end end
end def to_s
"Carro cor #{@cor}, #{@odometro}km"
a = [] end
a << Carro.new("azul") def incrementa_km
a << Carro.new("branco") @odometro += 1
a.each do |p| end
puts p.cor end
puts "----------------------"
end
puts Carro.fabricados
Conhecendo
Conhecendo o básico
Classes
class Carro class Carro
public public
attr_accessor :cor attr_accessor :cor
private private
attr_reader :odometro attr_reader :odometro
protected protected
attr_writer :senha attr_writer :senha
public public
def initialize(cor) def initialize(cor)
@cor = cor @cor = cor
@odometro = 0 @odometro = 0
@senha = “123456” @senha = “123456”
end end
end private
def metodo_privado
puts “privado”
end
end
Entrada e saída
Entrada e saída
Arquivos
# abrindo o arquivo
f = File.new(“teste.txt”,”r”)
f.close
# escrevendo em um arquivo
f = File.new(“teste2.txt”,”w”)
f.write “Oi!”
f.close
f = File.new(“teste2.txt”,”w”)
f << “Oi!”
f.close
Entrada e saída
Entrada e saída
Fluxos TCP
# abrindo o SMTP
require “socket”
smtp = TCPSocket.open(“localhost”,25)
puts stmp.gets
220 taq.server.com.br ESMTP Sendmail
smtp.puts(“EHLO taq.com.br”)
puts stmp.gets
250-taq.server.com.br Hello localhost [127.0.0.1], pleased to meet you\r\n
smtp.close
Entrada e saída
Entrada e saída
Fluxos UDP
# servidor
require 'socket'
porta = 12345
server = UDPSocket.new
server.bind("localhost",porta)
puts "Servidor conectado na porta #{porta}, aguardando ..."
loop do
msg,sender = server.recvfrom(256)
msg.chomp!
host = sender[3]
puts "Host #{host} enviou um pacote UDP: #{msg}"
break unless msg.chomp != "kill"
end
puts "Kill recebido, fechando servidor."
server.close
Entrada e saída
Entrada e saída
Fluxos UDP
# cliente
require 'socket'
porta = 12345
client = UDPSocket.open
client.connect("localhost",porta)
loop do
puts "Digite sua mensagem (quit termina, kill finaliza servidor):"
msg = gets.chomp
client.send(msg,0)
break if "kill,quit".include? msg
end
client.close
# rodando
Digite sua mensagem (quit termina, kill finaliza servidor): oi!
Host 127.0.0.1 enviou um pacote UDP: oi!
Entrada e saída
Entrada e saída
HTTP
require "net/http"
s = Net::HTTP.get("www.kernel.org","/")
puts s
require "net/http"
s = Net::HTTP.get("www.kernel.org","/")
s.scan(/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/).uniq.sort.each do |k|
puts "kernel #{k} disponivel"
end
kernel 2.0.40 disponivel
kernel 2.2.26 disponivel
kernel 2.2.27 disponivel
Exceções
Exceções
Begin ... rescue ... ensure ... end
i1 = 1
i2 = “dois”
begin
i1 + i2
rescue => exc
puts “Erro: #{exc} (#{exc.class})”
ensure
puts “Passei aqui!”
end
class Palmtop
include Bipadores
end
Módulos
Módulos
Mixin's
class Teste class Teste
attr_reader :valor include Enumerable
include Comparable def initialize(a)
def initialize(v) @array = a
@valor = v end
end def each
def <=>(outra) @array.each do |v|
self.valor <=> outra.valor yield v
end end
end end
end
t1 = Teste.new(1)
t2 = Teste.new(2) t = Teste.new([3,5,1,2,4])
puts t.sort => 1,2,3,4,5
puts t1 > t2 puts t.include?(3) => true
puts t2 < t1 puts t.include?(10) => false
puts t1 == t1 puts t.min => 1
puts t.max => 5
false puts t.sort.map {|v| v*10} => 10,20,30,40,50
false
true
Threads
Threads
Threads
t = Thread.new do thread inicializada
puts "thread inicializada." linha 0
5.times do |n| linha 1
puts "linha #{n}" linha 2
sleep(1) linha 3
end linha 4
end thread finalizada
t.join
puts “thread finalizada”
Threads
Threads
Threads
iniciando Proc 1, 5 loops
p = Proc.new do |n,c| Proc 1/1
puts "iniciando Proc #{n}, #{c} loops" iniciando Proc 2, 4 loops
c.times do |x| Proc 2/1
puts "Proc #{n}/#{x+1}" iniciando Proc 3, 3 loops
sleep(1) Proc 3/1
end iniciando Proc 4, 2 loops
end Proc 4/1
iniciando Proc 5, 1 loops
t1 = Thread.new(1,5,&p) Proc 5/1
t2 = Thread.new(2,4,&p) Proc 4/2
t3 = Thread.new(3,3,&p) Proc 3/2
t4 = Thread.new(4,2,&p) Proc 2/2
t5 = Thread.new(5,1,&p) Proc 1/2
t1.join Proc 3/3
Proc 2/3
Proc 1/3
Proc 2/4
Proc 1/4
Proc 1/5
Threads
Threads
Threads
DBI.connect(“DBI:Mysql:taq:localhost”,”taq”,”minhasenha”) do |con|
con.execute(“select * from pedidos”) do |rst|
rst.fetch do |row|
printf “cliente: %06d produto: %s\n”,row[“cliente”],row[“produto”]
end
end
end
DBI.connect("DBI:Mysql:taq:localhost","taq","minhasenha") do |con|
con.execute("select cliente,descricao from pedidos") do |rst|
rows = rst.fetch_all
cols = rst.column_names
DBI::Utils::TableFormatter.ascii(cols,rows)
end
end
+++
| cliente | descricao |
+++
| 1 | CD Anthrax Greater of Two Evils |
| 1 | DVD Slayer Still Reigning |
| 2 | CD Judas Priest Angel of Retribution |
+++
Banco
Banco de de dados
dados
Formatação especializada - XML
require "dbi"
DBI.connect("DBI:Mysql:taq:localhost","taq","minhasenha") do |con|
DBI::Utils::XMLFormatter.table(con.select_all("select cliente,descricao from pedidos"))
end
<?xml version="1.0" encoding="UTF8"?>
<rows>
<row>
<cliente>1</cliente>
<descricao>CD Anthrax Greater of Two Evils</descricao>
</row>
<row>
<cliente>1</cliente>
<descricao>DVD Slayer Still Reigning</descricao>
</row>
<row>
<cliente>2</cliente>
<descricao>CD Judas Priest Angel of Retribution</descricao>
</row>
</rows>
Web
Web
eruby
<html>
<head>
<title>Teste do eruby</title>
<style>
body { font-family:sans-serif; }
table { border:1px solid blue; }
caption { background:blue; color:white; font-weight:bold; }
th { text-align:left; }
caption, td, th { padding:5px; }
</style>
</head>
<body>
<table><caption>Lista de pedidos</caption>
<%
require "dbi"
DBI.connect("DBI:Mysql:taq:localhost","taq","minhasenha") do |con|
con.execute("select cliente,descricao from pedidos") do |rst|
print "<tr>"+(rst.column_info.map {|col| print "<th>"+col["name"]+"</th>"}).to_s+"</tr>"
rst.fetch do |row|
print "<tr>"+(row.map {|col| "<td>#{col}</td>"}.to_s)+"</tr>"
end
end
end
%></table>
</body>
</html>
Web
Web
eruby
<%
require "dbi"
DBI.connect("DBI:Mysql:taq:localhost","taq","minhasenha") do |con|
con.execute("select cliente,descricao from pedidos") do |rst|
print "<tr>"+(rst.column_info.map {|col| print "<th>"+col["name"]+"</th>"}).to_s+"</tr>"
rst.fetch do |row|
print "<tr>"+(row.map {|col| "<td>#{col}</td>"}.to_s)+"</tr>"
end
end
end
%>
Interface Gráfica
Interface Gráfica
Ruby/GTK2
require "gtk2"
Gtk.init # inicializa
w = Gtk::Window.new # cria uma janela
l = Gtk::Label.new("Oi, mundo GUI!") # cria uma label
w.add(l) # adiciona label
w.border_width = 10 # borda
w.show_all # mostra a janela
root root
“3” “3”
root root
“1” (2) “4” (1) “6” (1) “1” (1) “4” (1) “6” (1)
def list
print "Listando todos os CustomObject's com ObjectSpace\n"
print "#{ObjectSpace.each_object(CustomObject) {|v| puts v}} objetos encontrados\n\n"
end
begin
c1 = CustomObject.new("1",CustomObject.new("2",CustomObject.new("3")))
c4 = CustomObject.new("4",CustomObject.new("5"))
c6 = CustomObject.new("6")
c1.next.next.next = c1
list
c1 = nil
c4.next = nil
end
GC.start
sleep(1)
list
Garbage Collector
Garbage Collector
Mark-and-sweep
Listando todos os CustomObject's com ObjectSpace
Objeto 6 (-604874976) aponta para nada ()
Objeto 4 (-604874956) aponta para 5 (-604874946)
Objeto 5 (-604874946) aponta para nada ()
Objeto 1 (-604874916) aponta para 2 (-604874906)
Objeto 2 (-604874906) aponta para 3 (-604874896)
Objeto 3 (-604874896) aponta para 1 (-604874916)
6 objetos encontrados