Escolar Documentos
Profissional Documentos
Cultura Documentos
O Ruby possui recursos semelhantes aos do Smalltalk, Perl e Python. Perl, Python e
Smalltalk são linguagens de script. O Smalltalk é uma verdadeira linguagem orientada a
objetos. Ruby, como o Smalltalk, é uma linguagem perfeita orientada a objetos. Usar a
sintaxe do Ruby é muito mais fácil do que usar a sintaxe do Smalltalk.
Recursos do Ruby
Ruby é um código aberto e está disponível gratuitamente na Web, mas está
sujeito a uma licença.
Ruby pode ser usado para escrever scripts CGI (Common Gateway Interface).
Ruby tem uma sintaxe limpa e fácil que permite que um novo desenvolvedor
aprenda de maneira rápida e fácil.
O Ruby suporta muitas ferramentas GUI, como Tcl / Tk, GTK e OpenGL.
O Ruby possui um rico conjunto de funções internas, que podem ser usadas
diretamente em scripts Ruby.
Ruby 1.8.5
Este tutorial fornecerá as habilidades necessárias para criar GUI, rede e aplicativos da
Web usando o Ruby. Ele também falará sobre estender e incorporar aplicativos Ruby.
O que é o próximo?
O próximo capítulo orienta você para onde você pode obter Ruby e sua documentação.
Finalmente, ele instrui sobre como instalar o Ruby e preparar um ambiente para
desenvolver aplicativos Ruby.
Ruby Command Line Options - Este capítulo lista todas as opções de linha de
comando, que você pode usar junto com o interpretador Ruby.
Ruby Environment Variables - Este capítulo tem uma lista de todas as
variáveis de ambiente importantes a serem configuradas para fazer o
interpretador de Ruby funcionar.
VIM (Vi IMproved) é um editor de texto muito simples. Isso está disponível
em quase todas as máquinas Unix e agora também no Windows. Caso contrário,
você pode usar seu editor vi favorito para escrever programas Ruby.
Esta ferramenta vem junto com a instalação do Ruby, então você não tem nada a fazer
para ter o IRb funcionando.
Basta digitar irb no seu prompt de comando e uma Sessão Interativa Ruby iniciará
conforme abaixo:
$irb
irb 0.6.1(99/09/16)
irb(main):001:0> def hello
irb(main):002:1> out = "Hello World"
irb(main):003:1> puts out
irb(main):004:1> end
nil
irb(main):005:0> hello
Hello World
nil
irb(main):006:0>
Não se preocupe com o que fizemos aqui. Você aprenderá todas essas etapas nos
capítulos subseqüentes.
O que é o próximo?
Nós assumimos que agora você tem um Ambiente Ruby funcional e você está pronto
para escrever o primeiro Programa Ruby. O próximo capítulo ensinará como escrever
programas em Ruby.
Ruby - sintaxe
Vamos escrever um programa simples em ruby. Todos os arquivos ruby terão extensão
.rb . Então, coloque o seguinte código-fonte em um arquivo test.rb.
Demonstração ao vivo
#!/usr/bin/ruby -w
Aqui, assumimos que você tem o interpretador Ruby disponível no diretório / usr / bin.
Agora, tente executar este programa da seguinte maneira -
$ ruby test.rb
Hello, Ruby!
Você viu um programa Ruby simples, agora vamos ver alguns conceitos básicos
relacionados à sintaxe do Ruby.
Exemplo
a + b is interpreted as a+b ( Here a is a local variable)
a +b is interpreted as a(+b) ( Here a is a method call)
Identificadores Ruby
Identificadores são nomes de variáveis, constantes e métodos. Identificadores Ruby
diferenciam maiúsculas de minúsculas. Isso significa que Ram e RAM são dois
identificadores diferentes em Ruby.
Palavras reservadas
A lista a seguir mostra as palavras reservadas em Ruby. Essas palavras reservadas não
podem ser usadas como nomes constantes ou variáveis. Eles podem, no entanto, ser
usados como nomes de métodos.
print <<EOF
This is the first way of creating
here document ie. multiple line string.
EOF
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
BEGIN {
puts "Initializing Ruby Program"
}
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
Comentários Ruby
Um comentário oculta uma linha, parte de uma linha ou várias linhas do interpretador
Ruby. Você pode usar o caractere hash (#) no início de uma linha -
Ou, um comentário pode estar na mesma linha depois de uma declaração ou expressão
-
# This is a comment.
# This is a comment, too.
# This is a comment, too.
# I said that already.
Aqui está outra forma. Este comentário do bloco oculta várias linhas do interpretador
com = begin / = end -
= begin
This is a comment.
This is a comment, too.
This is a comment, too.
I said that already.
= end
Encapsulamento de dados
Abstração de dados
Polimorfismo
Herança
Esses recursos foram discutidos no capítulo Ruby Orientado a Objetos .
Um veículo também pode ter certas funções, como parar, dirigir e acelerar. Até mesmo
essas funções formam os membros de dados da classe Vehicle. Você pode, portanto,
definir uma classe como uma combinação de características e funções.
Class Vehicle {
Number no_of_wheels
Number horsepower
Characters type_of_tank
Number Capacity
Function speeding {
}
Function driving {
}
Function halting {
}
}
Ao atribuir valores diferentes a esses membros de dados, você pode formar várias
instâncias da classe Vehicle. Por exemplo, um avião tem três rodas, potência de 1.000,
combustível como o tipo de tanque e capacidade de 100 litros. Da mesma forma, um
carro tem quatro rodas, potência de 200, gás como o tipo de tanque e uma capacidade
de 25 litros.
Uma classe em Ruby sempre começa com a classe de palavra-chave seguida pelo nome
da classe. O nome deve estar sempre em maiúsculas iniciais. A classe Cliente pode ser
exibida como -
class Customer
end
Você encerra uma classe usando o final da palavra-chave . Todos os membros de dados
da classe estão entre a definição de classe e a palavra-chave final .
Variáveis em uma classe Ruby
Ruby fornece quatro tipos de variáveis -
Exemplo
Usando a variável de classe @@ no_of_customers, você pode determinar o número de
objetos que estão sendo criados. Isso permite derivar o número de clientes.
class Customer
@@no_of_customers = 0
end
Aqui está o exemplo para criar dois objetos cust1 e cust2 da classe Customer -
Aqui, cust1 e cust2 são os nomes de dois objetos. Você escreve o nome do objeto
seguido pelo sinal de igual a (=) após o qual o nome da classe seguirá. Em seguida, o
operador de ponto e a palavra-chave new serão seguidos.
Método Customizado para Criar Objetos Ruby
Você pode passar parâmetros para o método new e esses parâmetros podem ser
usados para inicializar variáveis de classe.
Quando você planeja declarar o novo método com parâmetros, é necessário declarar o
método inicializar no momento da criação da classe.
O método initialize é um tipo especial de método, que será executado quando o novo
método da classe for chamado com parâmetros.
class Customer
@@no_of_customers = 0
def initialize(id, name, addr)
@cust_id = id
@cust_name = name
@cust_addr = addr
end
end
Neste exemplo, você declara o método initialize com id, name e addr como variáveis
locais. Aqui, def e end são usados para definir uma inicialização do método Ruby . Você
aprenderá mais sobre métodos nos próximos capítulos.
No método initialize , você passa os valores dessas variáveis locais para as variáveis de
instância @cust_id, @cust_name e @cust_addr. Aqui, as variáveis locais mantêm os
valores que são passados junto com o novo método.
class Sample
def function
statement 1
statement 2
end
end
class Sample
def hello
puts "Hello Ruby!"
end
end
Agora, no exemplo a seguir, crie um objeto da classe Sample e chame o método hello e
veja o resultado -
Demonstração ao vivo
#!/usr/bin/ruby
class Sample
def hello
puts "Hello Ruby!"
end
end
Hello Ruby!
Existem cinco tipos de variáveis suportadas pelo Ruby. Você já passou por uma
pequena descrição dessas variáveis no capítulo anterior também. Esses cinco tipos de
variáveis são explicados neste capítulo.
class1obj = Class1.new
class1obj.print_global
class2obj = Class2.new
class2obj.print_global
class Customer
def initialize(id, name, addr)
@cust_id = id
@cust_name = name
@cust_addr = addr
end
def display_details()
puts "Customer id #@cust_id"
puts "Customer name #@cust_name"
puts "Customer address #@cust_addr"
end
end
# Create Objects
cust1 = Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2 = Customer.new("2", "Poul", "New Empire road, Khandala")
# Call Methods
cust1.display_details()
cust2.display_details()
Fazer referência a uma variável de classe não inicializada produz um erro. As variáveis
de classe são compartilhadas entre os descendentes da classe ou módulo em que as
variáveis de classe são definidas.
class Customer
@@no_of_customers = 0
def initialize(id, name, addr)
@cust_id = id
@cust_name = name
@cust_addr = addr
end
def display_details()
puts "Customer id #@cust_id"
puts "Customer name #@cust_name"
puts "Customer address #@cust_addr"
end
def total_no_of_customers()
@@no_of_customers += 1
puts "Total number of customers: #@@no_of_customers"
end
end
# Create Objects
cust1 = Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2 = Customer.new("2", "Poul", "New Empire road, Khandala")
# Call Methods
cust1.total_no_of_customers()
cust2.total_no_of_customers()
Quando uma variável local não inicializada é referenciada, ela é interpretada como uma
chamada para um método que não possui argumentos.
Constantes Ruby
As constantes começam com uma letra maiúscula. Constantes definidas dentro de uma
classe ou módulo podem ser acessadas de dentro dessa classe ou módulo, e aquelas
definidas fora de uma classe ou módulo podem ser acessadas globalmente.
Constantes não podem ser definidas dentro de métodos. Fazer referência a uma
constante não inicializada produz um erro. Fazer uma atribuição a uma constante já
inicializada produz um aviso.
Demonstração ao vivo
#!/usr/bin/ruby
class Example
VAR1 = 100
VAR2 = 200
def show
puts "Value of first Constant is #{VAR1}"
puts "Value of second Constant is #{VAR2}"
end
end
# Create Objects
object = Example.new()
object.show
Pseudo-Variáveis Ruby
Eles são variáveis especiais que têm a aparência de variáveis locais, mas se comportam
como constantes. Você não pode atribuir nenhum valor a essas variáveis.
Números inteiros
30 30-1
Ruby suporta números inteiros. Um número inteiro pode variar de -2 a 2 ou -2
62 62-1
a2 . Inteiros dentro deste intervalo são objetos da classe Fixnum e inteiros fora
desse intervalo são armazenados em objetos da classe Bignum .
Você escreve inteiros usando um sinal principal opcional, um indicador de base opcional
(0 para octal, 0x para hexadecimal ou 0b para binário), seguido por uma cadeia de
dígitos na base apropriada. Caracteres de sublinhado são ignorados na seqüência de
dígitos.
Exemplo
Números Flutuantes
Ruby suporta números flutuantes. Eles também são números, mas com decimais. Os
números de ponto flutuante são objetos da classe Float e podem ser qualquer um dos
seguintes -
Exemplo
Literais de cordas
Strings Ruby são simplesmente seqüências de bytes de 8 bits e são objetos da classe
String. As cadeias de caracteres com aspas duplas permitem a notação de substituição
e contrabarra, mas as cadeias de caracteres com aspas simples não permitem a
substituição e permitem a notação de contrabarra apenas para \\ e \ '
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby -w
Você pode substituir o valor de qualquer expressão Ruby em uma string usando a
sequência # {expr} . Aqui, expr poderia ser qualquer expressão rubi.
Demonstração ao vivo
#!/usr/bin/ruby -w
\n Newline (0x0a)
\f Formfeed (0x0c)
\b Backspace (0x08)
\e Escape (0x1b)
\s Espaço (0x20)
\ cx, \ Cx Controle-x
\ Mx Meta-x (c | 0x80)
\ M- \ Cx Meta-Control-x
\x Personagem x
Para mais detalhes sobre Ruby Strings, passe por Ruby Strings .
Ruby Arrays
Os literais do Ruby Array são criados colocando-se uma série de referências de objeto
separadas por vírgulas entre os colchetes. Uma vírgula final é ignorada.
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
fred
10
3.14
This is a string
last element
Para mais detalhes sobre Ruby Arrays, passe por Ruby Arrays .
Hashes Ruby
Um literal Ruby Hash é criado colocando uma lista de pares chave / valor entre chaves,
com uma vírgula ou a sequência => entre a chave e o valor. Uma vírgula final é
ignorada.
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
hsh = colors = { "red" => 0xf00, "green" => 0x0f0, "blue" => 0x00f }
hsh.each do |key, value|
print key, " is ", value, "\n"
end
Para mais detalhes sobre Ruby Hashes, passe por Ruby Hashes .
Ruby Ranges
Um intervalo representa um intervalo que é um conjunto de valores com início e fim. Os
intervalos podem ser construídos usando s..e e s ... e literais ou com Range.new.
Intervalos construídos usando .. correr desde o início até o fim, inclusive. Aqueles
criados usando ... excluem o valor final. Quando usado como um iterador, os intervalos
retornam cada valor na sequência.
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
(10..15).each do |n|
print n, ' '
end
10 11 12 13 14 15
Ruby - Operadores
Ruby suporta um rico conjunto de operadores, como você esperaria de uma linguagem
moderna. A maioria dos operadores são, na verdade, chamadas de método. Por
exemplo, a + b é interpretada como a + (b), onde o método + no objeto referido pela
variável a é chamado com b como seu argumento.
Para cada operador (+ - * /% ** & | ^ << >> && ||), existe uma forma
correspondente de operador de atribuição abreviado (+ = - = etc.).
Usado para testar a igualdade dentro de uma (1 ... 10) === 5 retorna
===
cláusula when de uma instrução case . verdadeiro.
a = 10
b = 20
c = 30
A atribuição paralela também é útil para trocar os valores mantidos em duas variáveis -
a, b = b, c
a = 0011 1100
b = 0000 1101
------------------
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011
Binary AND Operator copia um pouco para o (a & b) dará 12, que é 0000
E resultado, se existir em ambos os operandos. 1100
Operador binário OR copia um bit se existir (a | b) vai dar 61, que é 0011
|
em um dos operandos. 1101
Operador XOR binário copia o bit se estiver (a ^ b) dará 49, que é 0011
^ definido em um operando, mas não em 0001
ambos.
Operador NÃO Lógico Chamado. Use para reverter o estado lógico ! (a && b)
! de seu operando. Se uma condição for verdadeira, o operador é falso.
Lógico NOT tornará falso.
Operador NÃO Lógico Chamado. Use para reverter o estado lógico não (a &&
não de seu operando. Se uma condição for verdadeira, o operador b) é falso.
Lógico NOT tornará falso.
Em Ruby, essas seqüências são criadas usando os operadores "..." e "...". O formulário
de dois pontos cria um intervalo inclusivo, enquanto o formulário de três pontos cria um
intervalo que exclui o valor alto especificado.
Uso 1
Por exemplo
foo = 42
defined? foo # => "local-variable"
defined? $_ # => "global-variable"
defined? bar # => nil (undefined)
Uso 2
Por exemplo
Uso 3
Por exemplo
Uso 4
Por exemplo
Você precisa apenas prefixar o :: Const_name com uma expressão que retorne a classe
ou objeto de módulo apropriado.
Segundo exemplo
|| Logical 'OR'
?: Ternário se-então-mais
=% = {= = - = + = | = & =
>> = << = * = && = || = Tarefa
** =
ou e Composição lógica
Ruby - Comentários
Comentários são linhas de anotações dentro do código Ruby que são ignoradas no
tempo de execução. Um comentário de linha única começa com # caractere e eles se
estendem de # até o final da linha da seguinte forma -
Demonstração ao vivo
#!/usr/bin/ruby -w
# This is a single line comment.
Hello, Ruby!
=begin
This is a multiline comment and con spwan as many lines as you
like. But =begin and =end should come in the first line only.
=end
Hello, Ruby!
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
x = 1
if x > 2
puts "x is greater than 2"
elsif x <= 2 and x!=0
puts "x is 1"
else
puts "I can't guess the number"
end
x is 1
Ruby se modificador
Sintaxe
code if condition
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
$debug = 1
print "debug\n" if $debug
debug
x = 1
unless x>=2
puts "x is less than 2"
else
puts "x is greater than 2"
end
x is less than 2
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
$var = 1
print "1 -- Value is set\n" if $var
print "2 -- Value is set\n" unless $var
$var = false
print "3 -- Value is set\n" unless $var
1 -- Value is set
3 -- Value is set
case expr0
when expr1, expr2
stmt1
when expr3, expr4
stmt2
else
stmt3
end
_tmp = expr0
if expr1 === _tmp || expr2 === _tmp
stmt1
elsif expr3 === _tmp || expr4 === _tmp
stmt2
else
stmt3
end
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
$age = 5
case $age
when 0 .. 2
puts "baby"
when 3 .. 6
puts "little child"
when 7 .. 12
puts "child"
when 13 .. 18
puts "youth"
else
puts "adult"
end
little child
Ruby - Loops
Loops em Ruby são usados para executar o mesmo bloco de código em um
determinado número de vezes. Este capítulo detalha todas as instruções de loop
suportadas pelo Ruby.
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
$i = 0
$num = 5
OR
begin
code
end while conditional
Se um modificador while segue uma instrução begin sem cláusulas rescue ou ensure, o
código é executado uma vez antes da condição ser avaliada.
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
$i = 0
$num = 5
begin
puts("Inside the loop i = #$i" )
$i +=1
end while $i < $num
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
$i = 0
$num = 5
OR
begin
code
end until conditional
Executa o código enquanto condicional é falso.
Se um modificador until seguir uma instrução begin sem cláusulas rescue ou ensure, o
código será executado uma vez antes da condição ser avaliada.
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
$i = 0
$num = 5
begin
puts("Inside the loop i = #$i" )
$i +=1;
end until $i > $num
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
for i in 0..5
puts "Value of local variable is #{i}"
end
Aqui, definimos o intervalo 0..5. A declaração para i em 0..5 permitirá que eu tome
valores na faixa de 0 a 5 (incluindo 5). Isso produzirá o seguinte resultado -
Não obstante, um para loop não criar um novo escopo de variáveis locais. Uma para o
circuito de expressão é separado do código pela palavra reservada fazer, uma nova
linha ou um ponto e vírgula.
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
(0..5).each do |i|
puts "Value of local variable is #{i}"
end
Encerra o loop mais interno. Encerra um método com um bloco associado, se chamado
dentro do bloco (com o método retornando nil).
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
for i in 0..5
if i > 2 then
break
end
puts "Value of local variable is #{i}"
end
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
for i in 0..5
if i < 2 then
next
end
puts "Value of local variable is #{i}"
end
Reinicia essa iteração do loop mais interno, sem verificar a condição de loop. Reinicia o
rendimento ou chama se chamado dentro de um bloco.
Exemplo
#!/usr/bin/ruby
for i in 0..5
if i < 2 then
puts "Value of local variable is #{i}"
redo
end
end
for i in 1..5
retry if some_condition # restart from i == 1
end
Exemplo
#!/usr/bin/ruby
for i in 0..5
retry if i > 2
puts "Value of local variable is #{i}"
end
Ruby - Métodos
Os métodos Ruby são muito semelhantes às funções em qualquer outra linguagem de
programação. Os métodos Ruby são usados para agrupar uma ou mais instruções
repetidas em uma única unidade.
Os nomes dos métodos devem começar com uma letra minúscula. Se você começar um
nome de método com uma letra maiúscula, Ruby pode pensar que é uma constante e,
portanto, pode analisar a chamada incorretamente.
Os métodos devem ser definidos antes de chamá-los, caso contrário, o Ruby levantará
uma exceção para a invocação do método indefinido.
Sintaxe
def method_name [( [arg [= default]]...[, * arg [, &expr ]])]
expr..
end
Você pode definir valores padrão para os parâmetros, que serão usados se o método for
chamado sem passar pelos parâmetros necessários -
Sempre que você chama o método simples, escreve apenas o nome do método da
seguinte forma -
method_name
method_name 25, 30
A desvantagem mais importante de usar métodos com parâmetros é que você precisa
lembrar o número de parâmetros sempre que chamar tais métodos. Por exemplo, se
um método aceita três parâmetros e você passa apenas dois, o Ruby exibe um erro.
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
Sintaxe
return [expr[`,' expr...]]
Se mais de duas expressões forem fornecidas, a matriz contendo esses valores será o
valor de retorno. Se nenhuma expressão for dada, nil será o valor de retorno.
Exemplo
return
OR
return 12
OR
return 1,2,3
def test
i = 100
j = 200
k = 300
return i, j, k
end
var = test
puts var
100
200
300
Nesse código, você declarou uma amostra de método que aceita um teste de
parâmetro. No entanto, esse parâmetro é um parâmetro variável. Isso significa que
esse parâmetro pode receber qualquer número de variáveis. Então, o código acima irá
produzir o seguinte resultado -
Métodos de aula
Quando um método é definido fora da definição da classe, o método é marcado como
privado por padrão. Por outro lado, os métodos definidos na definição de classe são
marcados como públicos por padrão. A visibilidade padrão e a marca privada dos
métodos podem ser alteradas por público ou privado do Módulo.
Sempre que você quiser acessar um método de uma classe, primeiro instancie a classe.
Então, usando o objeto, você pode acessar qualquer membro da classe.
Ruby dá a você uma maneira de acessar um método sem instanciar uma classe. Vamos
ver como um método de classe é declarado e acessado -
class Accounts
def reading_charge
end
def Accounts.return_date
end
end
Para acessar este método, você não precisa criar objetos da classe Accounts.
Sintaxe
alias method-name method-name
alias global-variable-name global-variable-name
Exemplo
alias foo bar
alias $MATCH $&
Aqui nós definimos foo alias para bar, e $ MATCH é um apelido para $ &
Sintaxe
undef method-name
Exemplo
Para indefinir um método chamado bar faça o seguinte -
undef bar
Ruby - Blocos
Você viu como o Ruby define os métodos em que você pode colocar o número de
instruções e, em seguida, chama esse método. Da mesma forma, Ruby tem um
conceito de Block.
Sintaxe
block_name {
statement1
statement2
..........
}
A declaração de rendimento
Vamos ver um exemplo da declaração de rendimento -
Demonstração ao vivo
#!/usr/bin/ruby
def test
puts "You are in the method"
yield
puts "You are again back to the method"
yield
end
test {puts "You are in the block"}
Você também pode passar parâmetros com a declaração de rendimento. Aqui está um
exemplo -
Demonstração ao vivo
#!/usr/bin/ruby
def test
yield 5
puts "You are in the method test"
yield 100
end
test {|i| puts "You are in the block #{i}"}
Aqui, a declaração de rendimento é escrita seguida por parâmetros. Você pode até
passar mais de um parâmetro. No bloco, você coloca uma variável entre duas linhas
verticais (||) para aceitar os parâmetros. Portanto, no código anterior, a instrução yield
5 passa o valor 5 como um parâmetro para o bloco de teste.
yield a, b
e o bloco é -
Blocos e Métodos
Você viu como um bloco e um método podem ser associados uns aos outros. Você
normalmente chama um bloco usando a instrução yield de um método que possui o
mesmo nome do bloco. Portanto, você escreve -
Demonstração ao vivo
#!/usr/bin/ruby
def test
yield
end
test{ puts "Hello world"}
Este exemplo é a maneira mais simples de implementar um bloco. Você chama o bloco
de teste usando a declaração de rendimento .
Mas se o último argumento de um método é precedido por &, então você pode passar
um bloco para este método e este bloco será atribuído ao último parâmetro. No caso de
ambos * e & estarem presentes na lista de argumentos, & devem vir mais tarde.
Demonstração ao vivo
#!/usr/bin/ruby
def test(&block)
block.call
end
test { puts "Hello World!"}
Hello World!
BEGIN {
# BEGIN block code
puts "BEGIN code block"
}
END {
# END block code
puts "END code block"
}
# MAIN block code
puts "MAIN code block"
Um programa pode incluir vários blocos BEGIN e END. Os blocos BEGIN são executados
na ordem em que são encontrados. Os blocos END são executados na ordem inversa.
Quando executado, o programa acima produz o seguinte resultado -
Sintaxe
module Identifier
statement1
statement2
...........
end
As constantes de módulo são nomeadas como constantes de classe, com uma letra
maiúscula inicial. As definições do método também são semelhantes: Os métodos do
módulo são definidos exatamente como os métodos de classe.
Como nos métodos de classe, você chama um método de módulo precedendo seu nome
com o nome do módulo e um ponto, e faz referência a uma constante usando o nome
do módulo e dois dois-pontos.
Exemplo
#!/usr/bin/ruby
module Trig
PI = 3.141592654
def Trig.sin(x)
# ..
end
def Trig.cos(x)
# ..
end
end
Podemos definir mais um módulo com o mesmo nome de função mas funcionalidade
diferente
#!/usr/bin/ruby
module Moral
VERY_BAD = 0
BAD = 1
def Moral.sin(badness)
# ...
end
end
Como os métodos de classe, sempre que você define um método em um módulo, você
especifica o nome do módulo seguido por um ponto e, em seguida, o nome do método.
Sintaxe
require filename
Aqui, não é necessário fornecer extensão .rb junto com um nome de arquivo.
Exemplo
require 'trig.rb'
require 'moral'
y = Trig.sin(Trig::PI/4)
wrongdoing = Moral.sin(Moral::VERY_BAD)
Aqui estamos usando $ LOAD_PATH << '.' para tornar Ruby ciente de que os arquivos
incluídos devem ser pesquisados no diretório atual. Se você não quiser usar $
LOAD_PATH, então você pode usar require_relative para incluir arquivos de um
diretório relativo.
Sintaxe
include modulename
Exemplo
Considere o seguinte módulo escrito no arquivo support.rb .
module Week
FIRST_DAY = "Sunday"
def Week.weeks_in_month
puts "You have four weeks in a month"
end
def Week.weeks_in_year
puts "You have 52 weeks in a year"
end
end
Agora, você pode incluir este módulo em uma classe da seguinte maneira -
#!/usr/bin/ruby
$LOAD_PATH << '.'
require "support"
class Decade
include Week
no_of_yrs = 10
def no_of_months
puts Week::FIRST_DAY
number = 10*12
puts number
end
end
d1 = Decade.new
puts Week::FIRST_DAY
Week.weeks_in_month
Week.weeks_in_year
d1.no_of_months
Sunday
You have four weeks in a month
You have 52 weeks in a year
Sunday
120
Mixins em Ruby
Antes de passar por esta seção, assumimos que você tem o conhecimento de Conceitos
Orientados a Objetos.
Quando uma classe pode herdar recursos de mais de uma classe pai, a classe deve
mostrar herança múltipla.
O Ruby não suporta múltiplas heranças diretamente, mas o Ruby Modules tem outro
uso maravilhoso. De uma só vez, eles praticamente eliminam a necessidade de herança
múltipla, fornecendo uma facilidade chamada mixin .
module A
def a1
end
def a2
end
end
module B
def b1
end
def b2
end
end
class Sample
include A
include B
def s1
end
end
samp = Sample.new
samp.a1
samp.a2
samp.b1
samp.b2
samp.s1
O módulo A consiste nos métodos a1 e a2. O módulo B consiste nos métodos b1 e b2. A
classe Sample inclui os módulos A e B. A classe Sample pode acessar todos os quatro
métodos, a saber, a1, a2, b1 e b2. Portanto, você pode ver que a classe Sample herda
de ambos os módulos. Assim, você pode dizer que a classe Sample mostra herança
múltipla ou um mixin .
Ruby - Cordas
Um objeto String em Ruby mantém e manipula uma seqüência arbitrária de um ou mais
bytes, geralmente representando caracteres que representam a linguagem humana.
Os literais de string mais simples são colocados entre aspas simples (o caractere de
apóstrofo). O texto dentro das marcas de aspas é o valor da string -
A barra invertida também funciona para escapar de outra barra invertida, de modo que
a segunda barra invertida não é interpretada como um caractere de escape.
Substituição de Expressão
A substituição de expressão é um meio de incorporar o valor de qualquer expressão
Ruby em uma string usando # {e} -
Demonstração ao vivo
#!/usr/bin/ruby
x, y, z = 12, 36, 72
puts "The value of x is #{ x }."
puts "The sum of x and y is #{ x + y }."
puts "The average was #{ (x + y + z)/3 }."
Personagens de fuga
A tabela a seguir é uma lista de caracteres de escape ou não imprimíveis que
podem ser representados com a notação de barra invertida.
Codificação de caracteres
O conjunto de caracteres padrão para Ruby é ASCII, cujos caracteres podem ser
representados por bytes únicos. Se você usar o UTF-8 ou outro conjunto de caracteres
moderno, os caracteres poderão ser representados em um a quatro bytes.
Você pode alterar o seu conjunto de caracteres usando $ KCODE no início do seu
programa, como este -
$KCODE = 'u'
Isso retornará um novo objeto de string contendo uma cópia de str . Agora, usando o
objeto str , todos nós podemos usar qualquer método de instância disponível. Por
exemplo -
Demonstração ao vivo
#!/usr/bin/ruby
puts "#{foo}"
this is test
A seguir estão os métodos public String (Supondo que str seja um objeto
String) -
Exemplo
Tente o exemplo a seguir para descompactar vários dados.
Ruby - Arrays
Matrizes Ruby são ordenadas, coleções indexadas por inteiro de qualquer objeto. Cada
elemento em uma matriz é associado e referenciado por um índice.
Os arrays Ruby podem conter objetos como String, Integer, Fixnum, Hash, Symbol e
até mesmo outros objetos Array. Os arrays Ruby não são tão rígidos quanto os arrays
em outros idiomas. Os arrays Ruby crescem automaticamente ao adicionar elementos a
eles.
Criando Matrizes
Existem muitas maneiras de criar ou inicializar uma matriz. Uma maneira é com o novo
método de classe -
names = Array.new
names = Array.new(20)
20
20
Você também pode usar um bloco com novo, preenchendo cada elemento com o que o
bloco avalia para -
Demonstração ao vivo
#!/usr/bin/ruby
O módulo Kernel disponível no núcleo Ruby possui um método Array, que aceita apenas
um único argumento. Aqui, o método usa um intervalo como argumento para criar uma
matriz de dígitos -
Demonstração ao vivo
#!/usr/bin/ruby
digits = Array(0..9)
puts "#{digits}"
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Isso retornará uma nova matriz preenchida com os objetos fornecidos. Agora, usando o
objeto criado, podemos chamar qualquer método de instância disponível. Por exemplo -
Demonstração ao vivo
#!/usr/bin/ruby
digits = Array(0..9)
num = digits.at(6)
puts "#{num}"
Exemplo
Tente o exemplo a seguir para compactar vários dados.
Demonstração ao vivo
a = [ "a", "b", "c" ]
n = [ 65, 66, 67 ]
puts a.pack("A3A3A3") #=> "a b c "
puts a.pack("a3a3a3") #=> "a\000\000b\000\000c\000\000"
puts n.pack("ccc") #=> "ABC"
a b c
abc
ABC
Ruby - Hashes
Um hash é uma coleção de pares de valores-chave como este: "empregado" =>
"salário". É semelhante a um Array, exceto que a indexação é feita através de chaves
arbitrárias de qualquer tipo de objeto, não um índice inteiro.
A ordem na qual você percorre um hash por chave ou valor pode parecer arbitrária e
geralmente não estará na ordem de inserção. Se você tentar acessar um hash com uma
chave que não existe, o método retornará nulo .
Criando Hashes
Tal como acontece com as matrizes, existe uma variedade de maneiras de criar hashes.
Você pode criar um hash vazio com o novo método de classe -
months = Hash.new
Você também pode usar o novo para criar um hash com um valor padrão, que é de
outra forma apenas nulo -
or
Quando você acessa qualquer chave em um hash que tenha um valor padrão, se a
chave ou o valor não existir, o acesso ao hash retornará o valor padrão -
Demonstração ao vivo
#!/usr/bin/ruby
puts "#{months[0]}"
puts "#{months[72]}"
month
month
Demonstração ao vivo
#!/usr/bin/ruby
puts "#{H['a']}"
puts "#{H['b']}"
100
200
Você pode usar qualquer objeto Ruby como uma chave ou valor, até mesmo um array,
então o exemplo a seguir é válido -
Isso retornará um novo hash preenchido com os objetos fornecidos. Agora, usando o
objeto criado, podemos chamar qualquer método de instância disponível. Por exemplo -
Demonstração ao vivo
#!/usr/bin/ruby
$, = ", "
months = Hash.new( "month" )
months = {"1" => "January", "2" => "February"}
keys = months.keys
puts "#{keys}"
["1", "2"]
A seguir estão os métodos de hash públicos (supondo que hash é um objeto de matriz)
-
hash == other_hash
Testa se dois hashes são iguais, com base em se eles têm o mesmo número
1
de pares de valores-chave e se os pares de valores-chave correspondem ao
par correspondente em cada hash.
chave de hash]
2 Usando uma chave, faz referência a um valor do hash. Se a chave não for
encontrada, retorna um valor padrão.
hash.clear
4
Remove todos os pares de valores-chave do hash.
5 Retorna o valor padrão para hash , nil se não for definido por padrão =. ([]
retorna um valor padrão se a chave não existir no hash .)
hash.default = obj
6
Define um valor padrão para hash .
7 hash.default_proc
9 Exclui um par de valores-chave do hash para cada par que o bloco avalia como
verdadeiro .
10 Itera sobre hash , chamando o bloco uma vez para cada chave, passando o
valor-chave como uma matriz de dois elementos.
11 Itera sobre hash , chamando o bloco uma vez para cada chave, passando a
chave como parâmetro.
12 Itera sobre hash , chamando o bloco uma vez para cada chave , passando a
chave e valor como parâmetros.
13 Itera sobre hash , chamando o bloco uma vez para cada chave , passando o
valor como parâmetro.
hash.empty
Retorna um valor de hash para a chave dada . Se a chave não puder ser
encontrada e não houver outros argumentos, ela gerará uma exceção
IndexError ; se o padrão é dado, ele é retornado; se o bloco opcional for
especificado, seu resultado será retornado.
hash.has_value? (valor)
17
Testa se o hash contém o valor fornecido .
hash.index (valor)
hash.indexes (chaves)
Retorna um novo array que consiste em valores para a (s) chave (s) dada (s).
19
Inserirá o valor padrão para chaves que não são encontradas. Este método
está obsoleto. Use select.
hash.indices (chaves)
Retorna um novo array que consiste em valores para a (s) chave (s) dada (s).
20
Inserirá o valor padrão para chaves que não são encontradas. Este método
está obsoleto. Use select.
hash.inspect
21
Retorna uma versão bonita de string de impressão de hash.
hash.invert
hash.keys
23
Cria um novo array com chaves do hash .
hash.length
24
Retorna o tamanho ou o comprimento do hash como um inteiro.
hash.rehash
27 Reconstrói o hash com base nos valores atuais de cada chave . Se os valores
foram alterados desde que foram inseridos, esse método reindexará o hash .
hash.replace (other_hash)
30
Substitui o conteúdo do hash pelo conteúdo de other_hash .
31 Retorna um novo array que consiste em pares key-value do hash para o qual o
bloco retorna true .
hash.shift
hash.size
33
Retorna o tamanho ou o comprimento do hash como um inteiro.
hash.sort
hash.to_a
hash.to_hash
37
Retorna o hash (self).
hash.to_s
hash.value? (valor)
40
Testa se o hash contém o valor fornecido .
valores de hash
41
Retorna uma nova matriz contendo todos os valores de hash .
Este capítulo familiariza você com todos os conceitos de data e hora mais desejados.
time1 = Time.new
puts "Current Time : " + time1.inspect
# Time.now is a synonym:
time2 = Time.now
puts "Current Time : " + time2.inspect
time = Time.new
# Components of a Time
puts "Current Time : " + time.inspect
puts time.year # => Year of the date
puts time.month # => Month of the date (1 to 12)
puts time.day # => Day of the date (1 to 31 )
puts time.wday # => 0: Day of week: 0 is Sunday
puts time.yday # => 365: Day of year
puts time.hour # => 23: 24-hour clock
puts time.min # => 59
puts time.sec # => 59
puts time.usec # => 999999: microseconds
puts time.zone # => "UTC": timezone name
# July 8, 2008
Time.local(2008, 7, 8)
# July 8, 2008, 09:10am, local time
Time.local(2008, 7, 8, 9, 10)
# July 8, 2008, 09:10 UTC
Time.utc(2008, 7, 8, 9, 10)
# July 8, 2008, 09:10:11 GMT (same as UTC)
Time.gm(2008, 7, 8, 9, 10, 11)
[sec,min,hour,day,month,year,wday,yday,isdst,zone]
Tente o seguinte -
Demonstração ao vivo
#!/usr/bin/ruby -w
time = Time.new
values = time.to_a
p values
Essa matriz pode ser passada para as funções Time.utc ou Time.local para obter
diferentes formatos de datas da seguinte maneira -
Demonstração ao vivo
#!/usr/bin/ruby -w
time = Time.new
values = time.to_a
puts Time.utc(*values)
time = Time.new
time = Time.new
puts time.to_s
puts time.ctime
puts time.localtime
puts time.strftime("%Y-%m-%d %H:%M:%S")
%uma
1
O nome abreviado do dia da semana (Sun).
%UMA
2
O nome completo do dia da semana (domingo).
3 %b
%c
5
A representação de data e hora local preferida.
%d
6
Dia do mês (01 a 31).
%H
7
Hora do dia, relógio de 24 horas (00 a 23).
%EU
8
Hora do dia, relógio de 12 horas (01 a 12).
%j
9
Dia do ano (001 a 366).
%m
10
Mês do ano (01 a 12).
%M
11
Minuto da hora (00 a 59).
%p
12
Indicador meridiano (AM ou PM).
%S
13
Segundo do minuto (00 a 60).
%VOCÊ
15 %W
%x
17
Representação preferida apenas para a data, sem tempo.
%X
18
Representação preferida apenas pelo tempo, sem data.
%y
19
Ano sem um século (00 a 99).
%Y
20
Ano com o século.
%Z
21
Nome do fuso horário.
%%
22
Caractere Literal%.
Aritmética do Tempo
Você pode executar aritmética simples com o tempo da seguinte forma -
Demonstração ao vivo
now = Time.now # Current time
puts now
Ruby cria essas seqüências usando os operadores de faixa '' .. '' e '' ... '' . O formulário
de dois pontos cria um intervalo inclusivo, enquanto o formulário de três pontos cria um
intervalo que exclui o valor alto especificado.
(1..5) #==> 1, 2, 3, 4, 5
(1...5) #==> 1, 2, 3, 4
('a'..'d') #==> 'a', 'b', 'c', 'd'
puts "#{range1}"
puts "#{range2}"
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
["bar", "bas", "bat"]
Os intervalos implementam métodos que permitem iterar sobre eles e testar seu
conteúdo de várias maneiras -
Demonstração ao vivo
#!/usr/bin/ruby
# Assume a range
digits = 0..9
puts digits.include?(5)
ret = digits.min
puts "Min value is #{ret}"
ret = digits.max
puts "Max value is #{ret}"
digits.each do |digit|
puts "In Loop #{digit}"
end
true
Min value is 0
Max value is 9
Rejected values are 5, 6, 7, 8, 9
In Loop 0
In Loop 1
In Loop 2
In Loop 3
In Loop 4
In Loop 5
In Loop 6
In Loop 7
In Loop 8
In Loop 9
while gets
print if /start/../end/
end
score = 70
puts result
Isso produzirá o seguinte resultado -
if ((1..10) === 5)
puts "5 lies in (1..10)"
end
5 lies in (1..10)
c lies in ('a'..'j')
Ruby - Iteradores
Iteradores não são nada além de métodos suportados por coleções . Objetos que
armazenam um grupo de membros de dados são chamados de coleções. Em Ruby,
matrizes e hashes podem ser chamados de coleções.
Sintaxe
collection.each do |variable|
code
end
Executa o código para cada elemento na coleção . Aqui, a coleção pode ser uma matriz
ou um hash de rubi.
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
ary = [1,2,3,4,5]
ary.each do |i|
puts i
end
1
2
3
4
5
Você sempre associa cada iterador a um bloco. Ele retorna cada valor da matriz, um por
um, ao bloco. O valor é armazenado na variável i e, em seguida, exibido na tela.
Sintaxe
collection = collection.collect
O método de coleta nem sempre precisa estar associado a um bloco. O método collect
retorna toda a coleção, independentemente de ser uma matriz ou um hash.
Exemplo
#!/usr/bin/ruby
a = [1,2,3,4,5]
b = Array.new
b = a.collect
puts b
1
2
3
4
5
OBSERVAÇÃO : o método collect não é o caminho certo para fazer cópias entre arrays.
Existe outro método chamado clone , que deve ser usado para copiar um array em
outro array.
Você normalmente usa o método collect quando deseja fazer algo com cada um dos
valores para obter o novo array. Por exemplo, esse código produz um array b contendo
10 vezes cada valor em a .
Demonstração ao vivo
#!/usr/bin/ruby
a = [1,2,3,4,5]
b = a.collect{|x| 10*x}
puts b
10
20
30
40
50
Ruby - File I / O
Ruby fornece um conjunto completo de métodos relacionados a E / S implementados no
módulo Kernel. Todos os métodos de E / S são derivados da classe IO.
A classe IO fornece todos os métodos básicos, como read, write, gets, puts, readline,
getc e printf .
Este capítulo cobrirá todas as funções básicas de E / S disponíveis no Ruby. Para mais
funções, por favor consulte Ruby Class IO .
A declaração puts
Nos capítulos anteriores, você atribuiu valores a variáveis e depois imprimiu a saída
usando a instrução puts .
A instrução puts instrui o programa a exibir o valor armazenado na variável. Isto irá
adicionar uma nova linha no final de cada linha que escreve.
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
A instrução recebe
A instrução gets pode ser usada para obter qualquer entrada do usuário da tela padrão
chamada STDIN.
Exemplo
O código a seguir mostra como usar a instrução gets. Esse código solicitará ao usuário
que insira um valor, que será armazenado em um valor variável e, finalmente, será
impresso no STDOUT.
#!/usr/bin/ruby
Enter a value :
This is entered value
This is entered value
A declaração putc
Ao contrário da instrução puts , que gera a string inteira na tela, a instrução putc pode
ser usada para gerar um caractere por vez.
Exemplo
A saída do código a seguir é apenas o caractere H -
Demonstração ao vivo
#!/usr/bin/ruby
A declaração de impressão
A instrução print é semelhante à instrução puts . A única diferença é que a instrução
puts vai para a próxima linha depois de imprimir o conteúdo, enquanto que com a
instrução print o cursor está posicionado na mesma linha.
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
O método File.new
Você pode criar um objeto File usando o método File.new para leitura, gravação ou
ambos, de acordo com a string de modo. Finalmente, você pode usar o método
File.close para fechar esse arquivo.
Sintaxe
aFile = File.new("filename", "mode")
# ... process the file
aFile.close
O método File.open
Você pode usar o método File.open para criar um novo objeto de arquivo e atribuir esse
objeto de arquivo a um arquivo. No entanto, há uma diferença entre File.Open e
File.New métodos. A diferença é que o método File.open pode ser associado a um
bloco, enquanto você não pode fazer o mesmo usando o método File.new .
O método sysread
Você pode usar o método sysread para ler o conteúdo de um arquivo. Você pode abrir o
arquivo em qualquer um dos modos ao usar o método sysread. Por exemplo -
#!/usr/bin/ruby
aFile = File.new("input.txt", "r")
if aFile
content = aFile.sysread(20)
puts content
else
puts "Unable to open file!"
end
O método syswrite
Você pode usar o método syswrite para gravar o conteúdo em um arquivo. Você precisa
abrir o arquivo no modo de gravação ao usar o método syswrite. Por exemplo -
#!/usr/bin/ruby
O método each_byte
Este método pertence à classe File . O método each_byte está sempre associado a um
bloco. Considere o seguinte exemplo de código -
#!/usr/bin/ruby
O método IO.readlines
A classe File é uma subclasse da classe IO. A classe IO também possui alguns métodos,
que podem ser usados para manipular arquivos.
Um dos métodos da classe IO é IO.readlines . Este método retorna o conteúdo do
arquivo linha por linha. O código a seguir exibe o uso do método IO.readlines -
#!/usr/bin/ruby
arr = IO.readlines("input.txt")
puts arr[0]
puts arr[1]
Neste código, a variável arr é um array. Cada linha do arquivo input.txt será um
elemento no array arr. Portanto, arr [0] conterá a primeira linha, enquanto arr [1]
conterá a segunda linha do arquivo.
O método IO.foreach
Este método também retorna saída linha por linha. A diferença entre o método foreach
e o método readlines é que o método foreach está associado a um bloco. No entanto,
ao contrário das linhas de leitura do método , o método foreach não retorna uma
matriz. Por exemplo -
#!/usr/bin/ruby
Este código passará o conteúdo do teste de arquivo linha a linha para o bloco de
variáveis e, em seguida, a saída será exibida na tela.
#!/usr/bin/ruby
#!/usr/bin/ruby
#!/usr/bin/ruby
A seguir está a tabela, que pode ajudá-lo a escolher uma máscara diferente
para o método chmod -
Inquéritos de arquivo
O comando a seguir testa se um arquivo existe antes de abri-lo -
#!/usr/bin/ruby
#!/usr/bin/ruby
#!/usr/bin/ruby
# a directory
File::directory?( "/usr/local/bin" ) # => true
# a file
File::directory?( "file.rb" ) # => false
#!/usr/bin/ruby
#!/usr/bin/ruby
#!/usr/bin/ruby
#!/usr/bin/ruby
O comando a seguir pode ser usado para localizar quando um arquivo foi criado,
modificado ou acessado pela última vez -
#!/usr/bin/ruby
Diretórios em Ruby
Todos os arquivos estão contidos em vários diretórios, e o Ruby não tem nenhum
problema em lidar com isso também. Enquanto a classe File manipula arquivos, os
diretórios são tratados com a classe Dir .
Dir.chdir("/usr/bin")
Você pode obter uma lista dos arquivos e diretórios dentro de um diretório específico
usando Dir.entries -
Dir.foreach("/usr/bin") do |entry|
puts entry
end
Uma forma ainda mais concisa de obter listagens de diretórios é usando o método array
da classe Dir -
Dir["/usr/bin/*"]
Criando um diretório
O Dir.mkdir pode ser usado para criar diretórios -
Dir.mkdir("mynewdir")
Você também pode definir permissões em um novo diretório (não um que já exista)
com mkdir -
NOTA - A máscara 755 define permissões owner, group, world [qualquer um] para
rwxr-xr-x onde r = read, w = write e x = execute.
Excluindo um diretório
O Dir.delete pode ser usado para excluir um diretório. O Dir.unlink e o Dir.rmdir
executam exatamente a mesma função e são fornecidos por conveniência.
Dir.delete("testdir")
Você pode usar Dir.tmpdir com File.join para criar um arquivo temporário independente
de plataforma -
require 'tmpdir'
tempfilename = File.join(Dir.tmpdir, "tingtong")
tempfile = File.new(tempfilename, "w")
tempfile.puts "This is a temporary file"
tempfile.close
File.delete(tempfilename)
Esse código cria um arquivo temporário, grava dados nele e o exclui. A biblioteca
padrão do Ruby também inclui uma biblioteca chamada Tempfile que pode criar
arquivos temporários para você -
require 'tempfile'
f = Tempfile.new('tingtong')
f.puts "Hello"
puts f.path
f.close
Funções incorporadas
Aqui estão as funções internas do ruby para processar arquivos e diretórios -
Ruby - exceções
A execução e a exceção sempre andam juntas. Se você está abrindo um arquivo, o que
não existe, então se você não lidou com esta situação corretamente, então seu
programa é considerado de má qualidade.
O programa pára se ocorrer uma exceção. Portanto, as exceções são usadas para
manipular vários tipos de erros, que podem ocorrer durante a execução de um
programa e tomar a ação apropriada, em vez de interromper completamente o
programa.
Ruby fornece um bom mecanismo para lidar com exceções. Colocamos o código que
poderia levantar uma exceção em um bloco de início / fim e usar cláusulas de
salvamento para dizer ao Ruby os tipos de exceções que queremos manipular.
Sintaxe
begin
# -
rescue OneTypeOfException
# -
rescue AnotherTypeOfException
# -
else
# Other exceptions
ensure
# Always will be executed
end
Tudo desde o início até o resgate é protegido. Se ocorrer uma exceção durante a
execução deste bloco de código, o controle é passado para o bloco entre resgate e fim .
Para cada cláusula de resgate no bloco de início , Ruby compara a exceção levantada
com cada um dos parâmetros, por sua vez. A correspondência será bem-sucedida se a
exceção nomeada na cláusula rescue for a mesma do tipo da exceção lançada
atualmente ou se for uma superclasse dessa exceção.
Em um evento em que uma exceção não corresponde a nenhum dos tipos de erro
especificados, podemos usar uma cláusula else após todas as cláusulas de resgate .
Exemplo
#!/usr/bin/ruby Demonstração ao vivo
begin
file = open("/unexistant_file")
if file
puts "File opened successfully"
end
rescue
file = STDIN
end
print file, "==", STDIN, "\n"
Isso produzirá o seguinte resultado. Você pode ver que STDIN é substituído por arquivo
porque a abertura falhou.
#<IO:0xb7d16f84>==#<IO:0xb7d16f84>
Sintaxe
begin
# Exceptions raised by this code will
# be caught by the following rescue clause
rescue
# This block will capture all types of exceptions
retry # This will move control to the beginning of begin
end
Exemplo
#!/usr/bin/ruby
begin
file = open("/unexistant_file")
if file
puts "File opened successfully"
end
rescue
fname = "existant_file"
retry
end
Sintaxe
raise
OR
OR
OR
A terceira forma usa o primeiro argumento para criar uma exceção e, em seguida,
define a mensagem associada ao segundo argumento.
A quarta forma é semelhante à terceira forma, mas você pode adicionar qualquer
instrução condicional como , a menos, para gerar uma exceção.
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
begin
puts 'I am before the raise.'
raise 'An error has occurred.'
puts 'I am after the raise.'
rescue
puts 'I am rescued.'
end
puts 'I am after the begin block.'
begin
raise 'A test exception.'
rescue Exception => e
puts e.message
puts e.backtrace.inspect
end
A test exception.
["main.rb:4"]
A cláusula de garantia faz exatamente isso. Certifique-se de que vai após a última
cláusula rescue e contém um pedaço de código que sempre será executado quando o
bloco terminar. Não importa se o bloco sai normalmente, se ele gera e resgata uma
exceção, ou se ele é terminado por uma exceção não identificada, o bloco de garantia
será executado.
Sintaxe
begin
#.. process
#..raise exception
rescue
#.. handle error
ensure
#.. finally ensure execution
#.. This will always execute.
end
Exemplo
Demonstração ao vivo
begin
raise 'A test exception.'
rescue Exception => e
puts e.message
puts e.backtrace.inspect
ensure
puts "Ensuring execution"
end
A test exception.
["main.rb:4"]
Ensuring execution
O corpo de uma cláusula else é executado apenas se nenhuma exceção for levantada
pelo corpo principal do código.
Sintaxe
begin
#.. process
#..raise exception
rescue
# .. handle error
else
#.. executes if there is no exception
ensure
#.. finally ensure execution
#.. This will always execute.
end
Exemplo
Demonstração ao vivo
begin
# raise 'A test exception.'
puts "I'm not raising exception"
rescue Exception => e
puts e.message
puts e.backtrace.inspect
else
puts "Congratulations-- no errors!"
ensure
puts "Ensuring execution"
end
A captura define um bloco rotulado com o nome fornecido (que pode ser um símbolo ou
uma string). O bloco é executado normalmente até que um lance seja encontrado.
Sintaxe
throw :lablename
#.. this will not be executed
catch :lablename do
#.. matching catch will be executed after a throw is encountered.
end
OR
Exemplo
O exemplo a seguir usa um lance para encerrar a interação com o usuário se '!' é
digitado em resposta a qualquer solicitação.
def promptAndGet(prompt)
print prompt
res = readline.chomp
throw :quitRequested if res == "!"
return res
end
catch :quitRequested do
name = promptAndGet("Name: ")
age = promptAndGet("Age: ")
sex = promptAndGet("Sex: ")
# ..
# process information
end
promptAndGet("Name:")
Você deve experimentar o programa acima na sua máquina porque ele precisa de
interação manual. Isso produzirá o seguinte resultado -
Exceção de Classe
As classes e módulos padrão do Ruby geram exceções. Todas as classes de exceção
formam uma hierarquia, com a exceção de classe no topo. O próximo nível contém sete
tipos diferentes -
Interromper
NoMemoryError
SignalException
Erro de script
Erro padrão
SystemExit
Existe uma outra exceção nesse nível, Fatal , mas o interpretador Ruby só usa isso
internamente.
Uma definição de classe começa com a classe de palavra-chave seguida pelo nome da
classe e é delimitada por um final . Por exemplo, definimos a classe Box usando a
classe de palavra-chave da seguinte maneira:
class Box
code
end
O nome deve começar com uma letra maiúscula e os nomes das convenções que
contêm mais de uma palavra são executados juntamente com cada palavra em
maiúscula e nenhum caractere separador (CamelCase).
box1 = Box.new
box2 = Box.new
O método inicializar
O método initialize é um método de classe Ruby padrão e funciona quase da mesma
maneira que o construtor funciona em outras linguagens de programação orientadas a
objeto. O método initialize é útil quando você deseja inicializar algumas variáveis de
classe no momento da criação do objeto. Este método pode ter uma lista de parâmetros
e, como qualquer outro método ruby, seria precedido por uma palavra-chave def como
mostrado abaixo -
class Box
def initialize(w,h)
@width, @height = w, h
end
end
As variáveis da instância
As variáveis de instância são tipos de atributos de classe e tornam-se propriedades
de objetos depois que os objetos são criados usando a classe. Os atributos de cada
objeto são atribuídos individualmente e não compartilham nenhum valor com outros
objetos. Eles são acessados usando o operador @ dentro da classe, mas para acessá-
los fora da classe, usamos métodos públicos , que são chamados de métodos de
acesso . Se tomarmos a classe acima definido Box então @largura e @height são
variáveis de instância para a caixa de classe.
class Box
def initialize(w,h)
# assign instance variables
@width, @height = w, h
end
end
# define a class
class Box
# constructor method
def initialize(w,h)
@width, @height = w, h
end
# accessor methods
def printWidth
@width
end
def printHeight
@height
end
end
# create an object
box = Box.new(10, 20)
Semelhante aos métodos de acesso, que são usados para acessar o valor das variáveis,
Ruby fornece uma maneira de definir os valores dessas variáveis de fora da classe
usando métodos setter , que são definidos abaixo -
Demonstração ao vivo
#!/usr/bin/ruby -w
# define a class
class Box
# constructor method
def initialize(w,h)
@width, @height = w, h
end
# accessor methods
def getWidth
@width
end
def getHeight
@height
end
# setter methods
def setWidth=(value)
@width = value
end
def setHeight=(value)
@height = value
end
end
# create an object
box = Box.new(10, 20)
Os métodos da instância
Os métodos de instância também são definidos da mesma forma que definimos
qualquer outro método usando a palavra-chave def e eles podem ser usados usando
uma instância de classe apenas como mostrado abaixo. Sua funcionalidade não se
limita a acessar as variáveis de instância, mas também podem fazer muito mais
conforme sua necessidade.
Demonstração ao vivo
#!/usr/bin/ruby -w
# define a class
class Box
# constructor method
def initialize(w,h)
@width, @height = w, h
end
# instance method
def getArea
@width * @height
end
end
# create an object
box = Box.new(10, 20)
#!/usr/bin/ruby -w
class Box
# Initialize our class variables
@@count = 0
def initialize(w,h)
# assign instance avriables
@width, @height = w, h
@@count += 1
end
def self.printCount()
puts "Box count is : #@@count"
end
end
Box count is : 2
O método to_s
Qualquer classe que você definir deve ter um método de instância to_s para retornar
uma representação de string do objeto. A seguir, um exemplo simples para representar
um objeto Box em termos de largura e altura -
Demonstração ao vivo
#!/usr/bin/ruby -w
class Box
# constructor method
def initialize(w,h)
@width, @height = w, h
end
# define to_s method
def to_s
"(w:#@width,h:#@height)" # string formatting of the object.
end
end
# create an object
box = Box.new(10, 20)
Controle de acesso
O Ruby oferece três níveis de proteção no nível de métodos da instância, que podem
ser públicos, privados ou protegidos . Ruby não aplica nenhum controle de acesso
sobre variáveis de instância e classe.
# define a class
class Box
# constructor method
def initialize(w,h)
@width, @height = w, h
end
# create an object
box = Box.new(10, 20)
# define a class
class Box
# constructor method
def initialize(w,h)
@width, @height = w, h
end
# instance method
def getArea
@width * @height
end
end
# define a subclass
class BigBox < Box
# create an object
box = BigBox.new(10, 20)
# define a class
class Box
# constructor method
def initialize(w,h)
@width, @height = w, h
end
# instance method
def getArea
@width * @height
end
end
# define a subclass
class BigBox < Box
# create an object
box = BigBox.new(10, 20)
Sobrecarga do Operador
Gostaríamos que o operador + realizasse a adição vetorial de dois objetos Box usando
+, o operador * para multiplicar uma largura e altura de caixa por um escalar e o
operador unário para negar a largura e a altura da caixa. Aqui está uma versão da
classe Box com operadores matemáticos definidos -
class Box
def initialize(w,h) # Initialize the width and height
@width,@height = w, h
end
Objetos Congelados
Às vezes, queremos impedir que um objeto seja alterado. O método freeze em Object
nos permite fazer isso, transformando efetivamente um objeto em uma constante.
Qualquer objeto pode ser congelado chamando Object.freeze . Um objeto congelado
não pode ser modificado: você não pode alterar suas variáveis de instância.
# define a class
class Box
# constructor method
def initialize(w,h)
@width, @height = w, h
end
# accessor methods
def getWidth
@width
end
def getHeight
@height
end
# setter methods
def setWidth=(value)
@width = value
end
def setHeight=(value)
@height = value
end
end
# create an object
box = Box.new(10, 20)
Constantes de Classe
Você pode definir uma constante dentro de uma classe atribuindo um valor numérico ou
de seqüência direta a uma variável, que é definida sem usar @ ou @@. Por convenção,
nós mantemos nomes constantes em maiúsculas.
Uma vez que uma constante é definida, você não pode alterar seu valor, mas você pode
acessar uma constante diretamente dentro de uma classe como uma variável, mas se
você quiser acessar uma constante fora da classe, você deve usar classname ::
constant como mostrado o exemplo abaixo.
Demonstração ao vivo
#!/usr/bin/ruby -w
# define a class
class Box
BOX_COMPANY = "TATA Inc"
BOXWEIGHT = 10
# constructor method
def initialize(w,h)
@width, @height = w, h
end
# instance method
def getArea
@width * @height
end
end
# create an object
box = Box.new(10, 20)
# define a class
class Box
attr_accessor :width, :height
# constructor method
def initialize(w,h)
@width, @height = w, h
end
# instance method
def getArea
@width * @height
end
end
Informações de Classe
Se as definições de classe são código executável, isso implica que elas sejam
executadas no contexto de algum objeto: self deve referenciar alguma coisa. Vamos
descobrir o que é isso.
#!/usr/bin/ruby -w
class Box
# print class information
puts "Type of self = #{self.type}"
puts "Name of self = #{self.name}"
end
Quando o código acima é executado, produz o seguinte resultado -
Isso significa que uma definição de classe é executada com essa classe como o objeto
atual. Isso significa que os métodos na metaclasse e suas superclasses estarão
disponíveis durante a execução da definição do método.
Sintaxe
/pattern/
/pattern/im # option can be specified
%r!/usr/local! # general delimited regular expression
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
if ( line1 =~ /Cats(.*)/ )
puts "Line1 contains Cats"
end
if ( line2 =~ /Cats(.*)/ )
puts "Line2 contains Dogs"
end
x
3
Ignora o espaço em branco e permite comentários em expressões regulares.
u, e, s, n
Como os literais de string delimitados com% Q, Ruby permite que você inicie suas
expressões regulares com% r seguido por um delimitador de sua escolha. Isso é útil
quando o padrão que você está descrevendo contém muitos caracteres de barra que
você não quer escapar -
Casos de Repetição
Voltar Referências
Alternativas
Âncoras
Pesquisar e substituir
Alguns dos métodos String mais importantes que usam expressões regulares são sub e
gsub e suas variantes in-loco sub! e gsub! .
O sub e o gsub retornam uma nova string, deixando o original não modificado onde
como sub! e gsub! Modifique a string na qual eles são chamados.
DBI significa Database Independent Interface for Ruby, o que significa que o DBI
fornece uma camada de abstração entre o código Ruby e o banco de dados subjacente,
permitindo que você mude as implementações do banco de dados com muita facilidade.
Ele define um conjunto de métodos, variáveis e convenções que fornecem uma
interface de banco de dados consistente, independente do banco de dados real que está
sendo usado.
DB2
Base Frontal
mSQL
MySQL
ODBC
Oráculo
OCI8 (Oracle)
PostgreSQL
Servidor proxy
SQLite
SQLRelay
Arquitetura de um aplicativo DBI
O DBI é independente de qualquer banco de dados disponível no backend. Você pode
usar o DBI se estiver trabalhando com Oracle, MySQL ou Informix, etc. Isso fica claro
no diagrama de arquitetura a seguir.
Pré-requisitos
Se você quiser escrever scripts Ruby para acessar bancos de dados MySQL, você
precisará ter o módulo Ruby MySQL instalado.
Este módulo funciona como um DBD, conforme explicado acima, e pode ser baixado em
https://www.tmtm.org/en/mysql/ruby/
https://imgur.com/NFEuWe4/embed
Antes de iniciar esta instalação, certifique-se de ter o privilégio de root. Agora, siga os
passos abaixo -
Passo 1
$ tar zxf dbi-0.2.0.tar.gz
Passo 2
Vá no diretório de distribuição dbi-0.2.0 nd configure-o usando o script setup.rb nesse
diretório. O comando de configuração mais geral se parece com isso, sem argumentos
após o argumento de configuração. Este comando configura a distribuição para instalar
todos os drivers por padrão.
Para ser mais específico, forneça uma opção --with que lista as partes específicas da
distribuição que você deseja usar. Por exemplo, para configurar apenas o módulo DBI
principal e o driver do nível DBD do MySQL, emita o seguinte comando -
etapa 3
O passo final é construir o driver e instalá-lo usando os seguintes comandos -
#!/usr/bin/ruby -w
require "dbi"
begin
# connect to the MySQL server
dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
# get server version string and display it
row = dbh.select_one("SELECT VERSION()")
puts "Server version: " + row[0]
rescue DBI::DatabaseError => e
puts "An error occurred"
puts "Error code: #{e.err}"
puts "Error message: #{e.errstr}"
ensure
# disconnect from server
dbh.disconnect if dbh
end
Ao executar este script, ele produz o seguinte resultado em nossa máquina Linux.
Se uma conexão for estabelecida com a fonte de dados, um Database Handle será
retornado e salvo em dbh para uso posterior. Caso contrário, o dbh será definido como
valor nulo e o código de erro de retorno e.err e e :: errstr e uma string de erro
respectivamente.
Finalmente, antes de sair, assegure-se de que a conexão com o banco de dados esteja
fechada e os recursos sejam liberados.
Operação INSERIR
A operação INSERT é necessária quando você deseja criar seus registros em uma tabela
de banco de dados.
Uma vez que uma conexão de dados é estabelecida, estamos prontos para criar tabelas
ou registros nas tabelas de banco de dados usando fazer método ou preparar e
executar método.
Usando do Statement
Instruções que não retornam linhas podem ser emitidas invocando o método do
identificador do banco de dados. Esse método usa um argumento de string de instrução
e retorna uma contagem do número de linhas afetadas pela instrução.
Da mesma forma, você pode executar a instrução SQL INSERT para criar um registro
na tabela EMPLOYEE.
#!/usr/bin/ruby -w
require "dbi"
begin
# connect to the MySQL server
dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
dbh.do( "INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)" )
puts "Record has been created"
dbh.commit
rescue DBI::DatabaseError => e
puts "An error occurred"
puts "Error code: #{e.err}"
puts "Error message: #{e.errstr}"
dbh.rollback
ensure
# disconnect from server
dbh.disconnect if dbh
end
Preparando a instrução SQL com a instrução INSERT. Isso será feito usando o
método prepare .
Se tudo correr bem, confirme essa operação, caso contrário, você poderá
reverter a transação completa.
sth = dbh.prepare(statement)
sth.execute
... zero or more SQL operations ...
sth.finish
Esses dois métodos podem ser usados para transmitir valores de ligação para
instruções SQL. Pode haver um caso em que os valores a serem inseridos não sejam
dados antecipadamente. Nesse caso, os valores de ligação são usados. Um ponto de
interrogação ( ? ) É usado no lugar dos valores reais e, em seguida, os valores reais
são passados pela API execute ().
#!/usr/bin/ruby -w
require "dbi"
begin
# connect to the MySQL server
dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
sth = dbh.prepare( "INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME)
VALUES (?, ?, ?, ?, ?)" )
sth.execute('John', 'Poul', 25, 'M', 2300)
sth.execute('Zara', 'Ali', 17, 'F', 1000)
sth.finish
dbh.commit
puts "Record has been created"
rescue DBI::DatabaseError => e
puts "An error occurred"
puts "Error code: #{e.err}"
puts "Error message: #{e.errstr}"
dbh.rollback
ensure
# disconnect from server
dbh.disconnect if dbh
end
Se houver vários INSERTs por vez, preparar uma instrução primeiro e, em seguida,
executá-la várias vezes em um loop é mais eficiente do que invocar cada vez durante o
loop.
Operação de LEITURA
LEITURA Operação em qualquer banco de dados significa buscar algumas informações
úteis do banco de dados.
Uma vez estabelecida a nossa conexão com o banco de dados, estamos prontos para
fazer uma consulta neste banco de dados. Podemos usar tanto fazer método ou
preparar e executar métodos para buscar valores de uma tabela de banco de dados.
Preparando a consulta SQL com base nas condições necessárias. Isso será feito
usando o método prepare .
#!/usr/bin/ruby -w
require "dbi"
begin
# connect to the MySQL server
dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
sth = dbh.prepare("SELECT * FROM EMPLOYEE WHERE INCOME > ?")
sth.execute(1000)
sth.fetch do |row|
printf "First Name: %s, Last Name : %s\n", row[0], row[1]
printf "Age: %d, Sex : %s\n", row[2], row[3]
printf "Salary :%d \n\n", row[4]
end
sth.finish
rescue DBI::DatabaseError => e
puts "An error occurred"
puts "Error code: #{e.err}"
puts "Error message: #{e.errstr}"
ensure
# disconnect from server
dbh.disconnect if dbh
end
Existem mais métodos de atalho para buscar registros do banco de dados. Se você
estiver interessado, então vá até Buscar o Resultado. Caso contrário, vá para a
próxima seção.
Operação de atualização
ATUALIZAÇÃO Operação em qualquer banco de dados significa atualizar um ou mais
registros, que já estão disponíveis no banco de dados. A seguir, o procedimento para
atualizar todos os registros que possuem SEX como 'M'. Aqui, nós aumentaremos AGE
de todos os machos em um ano. Isso levará três etapas -
Preparando a consulta SQL com base nas condições necessárias. Isso será feito
usando o método prepare .
Se tudo correr bem, submeta essa operação, caso contrário, você poderá
reverter a transação completa.
#!/usr/bin/ruby -w
require "dbi"
begin
# connect to the MySQL server
dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
sth = dbh.prepare("UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = ?")
sth.execute('M')
sth.finish
dbh.commit
rescue DBI::DatabaseError => e
puts "An error occurred"
puts "Error code: #{e.err}"
puts "Error message: #{e.errstr}"
dbh.rollback
ensure
# disconnect from server
dbh.disconnect if dbh
end
Operação DELETE
A operação DELETE é necessária quando você deseja excluir alguns registros do banco
de dados. A seguir, o procedimento para excluir todos os registros do EMPLOYEE, nos
quais a idade é superior a 20. Essa operação seguirá as etapas a seguir.
Preparando a consulta SQL com base nas condições necessárias. Isso será feito
usando o método prepare .
Se tudo correr bem, submeta essa operação, caso contrário, você poderá
reverter a transação completa.
#!/usr/bin/ruby -w
require "dbi"
begin
# connect to the MySQL server
dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
sth = dbh.prepare("DELETE FROM EMPLOYEE WHERE AGE > ?")
sth.execute(20)
sth.finish
dbh.commit
rescue DBI::DatabaseError => e
puts "An error occurred"
puts "Error code: #{e.err}"
puts "Error message: #{e.errstr}"
dbh.rollback
ensure
# disconnect from server
dbh.disconnect if dbh
end
Executando Transações
As transações são um mecanismo que garante a consistência dos dados. As transações
devem ter as quatro propriedades a seguir -
Durabilidade - Uma vez que uma transação foi confirmada, os efeitos são
persistentes, mesmo após uma falha no sistema.
O DBI fornece dois métodos para confirmar ou reverter uma transação. Há mais um
método chamado transação, que pode ser usado para implementar transações. Existem
duas abordagens simples para implementar transações -
Abordagem I
A primeira abordagem usa os métodos de confirmação e reversão do DBI para
confirmar ou cancelar explicitamente a transação -
Abordagem II
A segunda abordagem usa o método de transação . Isso é mais simples, porque é
necessário um bloco de códigos contendo as instruções que compõem a transação. O
método de transação executa o bloco e invoca commit ou rollback automaticamente,
dependendo se o bloco é bem-sucedido ou falha -
Operação COMMIT
Commit é a operação, que dá um sinal verde ao banco de dados para finalizar as
mudanças e, após essa operação, nenhuma alteração pode ser revertida.
dbh.commit
Operação ROLLBACK
Se você não estiver satisfeito com uma ou mais das alterações e quiser reverter essas
alterações completamente, use o método de reversão .
Aqui está um exemplo simples para chamar o método de reversão .
dbh.rollback
dbh.disconnect
Se a conexão com um banco de dados for fechada pelo usuário com o método de
desconexão, todas as transações pendentes serão revertidas pelo DBI. No entanto, em
vez de depender de qualquer um dos detalhes de implementação do DBI, seria melhor
que seu aplicativo chamasse o commit ou o rollback explicitamente.
Manipulando Erros
Existem muitas fontes de erros. Alguns exemplos são um erro de sintaxe em uma
instrução SQL executada, uma falha de conexão ou a chamada do método de busca
para um identificador de instrução já cancelado ou concluído.
Se um método DBI falhar, o DBI levantará uma exceção. Os métodos DBI podem gerar
vários tipos de exceção, mas as duas classes de exceção mais importantes são DBI ::
InterfaceError e DBI :: DatabaseError .
Objetos de exceção dessas classes têm três atributos chamados err , errstr e state ,
que representam o número do erro, uma cadeia de erro descritiva e um código de erro
padrão. Os atributos são explicados abaixo -
Para obter informações de depuração sobre o que seu script está fazendo enquanto ele
é executado, você pode ativar o rastreamento. Para fazer isso, você deve primeiro
carregar o módulo dbi / trace e, em seguida, chamar o método de rastreio que controla
o modo de rastreio e o destino de saída -
require "dbi/trace"
..............
trace(mode, destination)
O valor do modo pode ser 0 (desligado), 1, 2 ou 3 e o destino deve ser um objeto IO.
Os valores padrão são 2 e STDERR, respectivamente.
Exemplo 1
O DBI.connect pode pegar um bloco de código, passar o identificador do banco de
dados para ele e desconectar automaticamente o identificador no final do bloco da
seguinte maneira.
Exemplo 2
O dbh.prepare pode pegar um bloco de código, passar o identificador de instrução
para ele e as chamadas automaticamente terminam no final do bloco da seguinte
maneira.
O método de transação DBI também aceita um bloco de código que foi descrito acima.
Exemplo
#!/usr/bin/ruby
require "dbi"
begin
# connect to the MySQL server
dbh = DBI.connect("DBI:Mysql:TESTDB:localhost", "testuser", "test123")
puts dbh.func(:client_info)
puts dbh.func(:client_version)
puts dbh.func(:host_info)
puts dbh.func(:proto_info)
puts dbh.func(:server_info)
puts dbh.func(:thread_id)
puts dbh.func(:stat)
rescue DBI::DatabaseError => e
puts "An error occurred"
puts "Error code: #{e.err}"
puts "Error message: #{e.errstr}"
ensure
dbh.disconnect if dbh
end
5.0.45
50045
Localhost via UNIX socket
10
5.0.45
150621
Uptime: 384981 Threads: 1 Questions: 1101078 Slow queries: 4 \
Opens: 324 Flush tables: 1 Open tables: 64 \
Queries per second avg: 2.860
Não só você pode escrever seu próprio servidor SMTP, daemon FTP ou servidor Web em
Ruby, mas você também pode usar Ruby para tarefas mais usuais, como programação
CGI ou como um substituto para PHP.
Por favor, passe alguns minutos com o Tutorial de Programação CGI para mais
detalhes sobre a programação CGI.
Aqui quando test.cgi é solicitado de um navegador da Web, o servidor Web procura por
test.cgi no site e, em seguida, o executa usando o interpretador Ruby. O script Ruby
retorna um cabeçalho HTTP básico e retorna um documento HTML básico.
Usando cgi.rb
O Ruby vem com uma biblioteca especial chamada cgi que permite interações mais
sofisticadas do que aquelas com o script CGI anterior.
require 'cgi'
cgi = CGI.new
puts cgi.header
puts "<html><body>This is a test</body></html>"
Aqui, você criou um objeto CGI e usou-o para imprimir a linha de cabeçalho para você.
Processamento de Formulários
Usando a classe CGI, você tem acesso aos parâmetros de consulta HTML de duas
maneiras. Suponha que recebamos uma URL de /cgi-bin/test.cgi?FirstName = Zara &
LastName = Ali.
#!/usr/bin/ruby
require 'cgi'
cgi = CGI.new
cgi['FirstName'] # => ["Zara"]
cgi['LastName'] # => ["Ali"]
Existe outra maneira de acessar essas variáveis de formulário. Este código lhe dará um
hash de todas as chaves e valores -
#!/usr/bin/ruby
require 'cgi'
cgi = CGI.new
h = cgi.params # => {"FirstName"=>["Zara"],"LastName"=>["Ali"]}
h['FirstName'] # => ["Zara"]
h['LastName'] # => ["Ali"]
#!/usr/bin/ruby
require 'cgi'
cgi = CGI.new
cgi.keys # => ["FirstName", "LastName"]
Neste exemplo, suponha que o formulário tenha três campos chamados "nome" e
inserimos três nomes "Zara", "Huma" e "Nuha" -
#!/usr/bin/ruby
require 'cgi'
cgi = CGI.new
cgi['name'] # => "Zara"
cgi.params['name'] # => ["Zara", "Huma", "Nuha"]
cgi.keys # => ["name"]
cgi.params # => {"name"=>["Zara", "Huma", "Nuha"]}
Nota - Ruby cuidará dos métodos GET e POST automaticamente. Não há tratamento
separado para esses dois métodos diferentes.
Um formulário associado, mas básico, que poderia enviar os dados corretos teria o
código HTML como assim -
<html>
<body>
<form method = "POST" action = "http://www.example.com/test.cgi">
First Name :<input type = "text" name = "FirstName" value = "" />
<br />
Last Name :<input type = "text" name = "LastName" value = "" />
<input type = "submit" value = "Submit Data" />
</form>
</body>
</html>
Para facilitar o aninhamento de tags, esses métodos usam seu conteúdo como blocos
de código. Os blocos de código devem retornar uma String , que será usada como
conteúdo da tag. Por exemplo -
#!/usr/bin/ruby
require "cgi"
cgi = CGI.new("html4")
cgi.out {
cgi.html {
cgi.head { "\n"+cgi.title{"This Is a Test"} } +
cgi.body { "\n"+
cgi.form {"\n"+
cgi.hr +
cgi.h1 { "A Form: " } + "\n"+
cgi.textarea("get_text") +"\n"+
cgi.br +
cgi.submit
}
}
}
}
Content-Type: text/html
Content-Length: 302
<HTML>
<HEAD>
<TITLE>This Is a Test</TITLE>
</HEAD>
<BODY>
<FORM METHOD = "post" ENCTYPE = "application/x-www-form-urlencoded">
<HR>
<H1>A Form: </H1>
<TEXTAREA COLS = "70" NAME = "get_text" ROWS = "10"></TEXTAREA>
<BR>
<INPUT TYPE = "submit">
</FORM>
</BODY>
</HTML>
Citando cordas
Ao lidar com URLs e código HTML, você deve ter cuidado ao citar certos caracteres. Por
exemplo, um caractere de barra (/) tem um significado especial em um URL, portanto,
ele deve ser de escape se não fizer parte do nome do caminho.
Por exemplo, qualquer / na parte de consulta da URL será traduzida para a string% 2F e
deverá ser traduzida de volta para a / para você usá-la. Espaço e e comercial também
são caracteres especiais. Para lidar com isso, o CGI fornece as rotinas CGI.escape e
CGI.unescape .
#!/usr/bin/ruby
require 'cgi'
puts CGI.escape(Zara Ali/A Sweet & Sour Girl")
Zara+Ali%2FA Sweet+%26+Sour+Girl")
#!/usr/bin/ruby
require 'cgi'
puts CGI.escapeHTML('<h1>Zara Ali/A Sweet & Sour Girl</h1>')
Cookies e Sessões
Nós explicamos esses dois conceitos em diferentes seções. Por favor, siga as seções -
Ruby fornece a classe Net :: SMTP para conexão do lado do cliente SMTP (Simple Mail
Transfer Protocol) e fornece dois métodos de classe new e start .
Exemplo
Aqui está uma maneira simples de enviar um email usando o script Ruby. Tente uma
vez -
require 'net/smtp'
message = <<MESSAGE_END
From: Private Person <me@fromdomain.com>
To: A Test User <test@todomain.com>
Subject: SMTP e-mail test
Net::SMTP.start('localhost') do |smtp|
smtp.send_message message, 'me@fromdomain.com', 'test@todomain.com'
end
Para enviar o e-mail, use Net :: SMTP para conectar-se ao servidor SMTP na máquina
local e use o método send_message junto com a mensagem, o endereço de e o
endereço de destino como parâmetros (embora os endereços de e para sejam dentro
do próprio e-mail, eles nem sempre são usados para rotear e-mail).
Se você não estiver executando um servidor SMTP em sua máquina, poderá usar o Net
:: SMTP para se comunicar com um servidor SMTP remoto. A menos que você esteja
usando um serviço de webmail (como o Hotmail ou o Yahoo! Mail), seu provedor de e-
mail fornecerá os detalhes do servidor de e-mail de saída que você pode fornecer para
o Net :: SMTP, da seguinte maneira -
Net::SMTP.start('mail.your-domain.com')
Net::SMTP.start('mail.your-domain.com',
25,
'localhost',
'username', 'password' :plain)
Ao enviar uma mensagem de e-mail, você pode especificar uma versão Mime, um tipo
de conteúdo e um conjunto de caracteres para enviar um e-mail em HTML.
Exemplo
A seguir, o exemplo para enviar conteúdo HTML como um email. Tente uma vez -
require 'net/smtp'
message = <<MESSAGE_END
From: Private Person <me@fromdomain.com>
To: A Test User <test@todomain.com>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP e-mail test
Net::SMTP.start('localhost') do |smtp|
smtp.send_message message, 'me@fromdomain.com', 'test@todomain.com'
end
Um limite é iniciado com dois hífens seguidos por um número exclusivo, que não pode
aparecer na parte da mensagem do email. Um limite final indicando a seção final do e-
mail também deve terminar com dois hífens.
Arquivos anexados devem ser codificados com a função pack ("m") para ter a
codificação base64 antes da transmissão.
Exemplo
A seguir está o exemplo, que enviará um arquivo /tmp/test.txt como anexo.
require 'net/smtp'
filename = "/tmp/test.txt"
# Read a file and encode it into base64 format
filecontent = File.read(filename)
encodedcontent = [filecontent].pack("m") # base64
marker = "AUNIQUEMARKER"
body = <<EOF
This is a test email to send an attachement.
EOF
# Define the main headers.
part1 = <<EOF
From: Private Person <me@fromdomain.net>
To: A Test User <test@todmain.com>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary = #{marker}
--#{marker}
EOF
#{body}
--#{marker}
EOF
#{encodedcontent}
--#{marker}--
EOF
NOTA - Você pode especificar vários destinos dentro da matriz, mas eles devem ser
separados por vírgula.
O Ruby também possui bibliotecas que fornecem acesso de nível superior a protocolos
de rede específicos no nível do aplicativo, como FTP, HTTP e assim por diante.
Este capítulo dá-lhe uma compreensão sobre o conceito mais famoso em Networking -
Socket Programming.
domínio
tipo
protocolo
3 Normalmente zero, isso pode ser usado para identificar uma variante de um
protocolo dentro de um domínio e tipo.
nome de anfitrião
Uma string, que pode ser um nome de host, um endereço com quatro pontos
ou um endereço IPV6 na notação de dois-pontos (e possivelmente ponto)
4
Uma string "<broadcast>", que especifica um endereço INADDR_BROADCAST.
porta
Cada servidor escuta os clientes que ligam em uma ou mais portas. Uma porta
5
pode ser um número de porta Fixnum, uma cadeia contendo um número de
porta ou o nome de um serviço.
Um cliente simples
Aqui vamos escrever um programa cliente muito simples, que abrirá uma conexão com
uma determinada porta e um determinado host. A classe Ruby TCPSocket fornece uma
função aberta para abrir um desses soquetes.
Depois de ter um soquete aberto, você pode ler como qualquer outro objeto de IO.
Quando terminar, lembre-se de fechá-lo, pois você fecharia um arquivo.
hostname = 'localhost'
port = 2000
s = TCPSocket.open(hostname, port)
Um servidor simples
Para gravar servidores da Internet, usamos a classe TCPServer . Um objeto TCPServer
é uma fábrica para objetos TCPSocket.
Agora, chame TCPServer.open (hostname, port function para especificar uma porta
para seu serviço e criar um objeto TCPServer .
Agora, execute este servidor em segundo plano e, em seguida, execute o cliente acima
para ver o resultado.
Usar Ruby Thread dessa maneira significa que o código é portátil e será executado da
mesma maneira no Linux, OS X e Windows.
require 'socket'
Para implementar o Web client similar, você pode usar uma biblioteca pré-construída
como o Net :: HTTP para trabalhar com HTTP. Aqui está o código que faz o equivalente
do código anterior -
Por favor, verifique bibliotecas semelhantes para trabalhar com protocolos FTP, SMTP,
POP e IMAP.
Leituras Adicionais
Nós lhe demos um começo rápido em Programação de Soquete. É um assunto grande,
por isso é recomendado que você vá através da Ruby Socket Library e Class Methods
para encontrar mais detalhes.
XML é uma linguagem de código aberto e portátil que permite aos programadores
desenvolver aplicativos que podem ser lidos por outros aplicativos, independentemente
do sistema operacional e / ou da linguagem de desenvolvimento.
O SAX obviamente não pode processar informações tão rápido quanto o DOM ao
trabalhar com arquivos grandes. Por outro lado, usar o DOM exclusivamente pode
realmente matar seus recursos, especialmente se usado em muitos arquivos pequenos.
SAX é somente leitura, enquanto o DOM permite alterações no arquivo XML. Como
essas duas APIs diferentes literalmente se complementam, não há motivos para não
usá-las em projetos grandes.
Para todos os nossos exemplos de código XML, vamos usar um arquivo XML simples
como uma entrada -
#!/usr/bin/ruby -w
require 'rexml/document'
include REXML
xmlfile = File.new("movies.xml")
xmldoc = Document.new(xmlfile)
#!/usr/bin/ruby -w
require 'rexml/document'
require 'rexml/streamlistener'
include REXML
class MyListener
include REXML::StreamListener
def tag_start(*args)
puts "tag_start: #{args.map {|x| x.inspect}.join(', ')}"
end
def text(data)
return if data =~ /^\w*$/ # whitespace only
abbrev = data[0..40] + (data.length > 40 ? "..." : "")
puts " text : #{abbrev.inspect}"
end
end
list = MyListener.new
xmlfile = File.new("movies.xml")
Document.parse_stream(xmlfile, list)
XPath e Ruby
Uma maneira alternativa de visualizar o XML é o XPath. Esse é um tipo de pseudo-
linguagem que descreve como localizar elementos e atributos específicos em um
documento XML, tratando esse documento como uma árvore ordenada lógica.
O REXML tem suporte para XPath através da classe XPath . Assume a análise baseada
em árvore (modelo de objeto de documento) como vimos acima.
#!/usr/bin/ruby -w
require 'rexml/document'
include REXML
xmlfile = File.new("movies.xml")
xmldoc = Document.new(xmlfile)
Rubi-Sablotron
Este analisador é escrito e mantido por Masayoshi Takahashi. Isso é escrito
principalmente para o Linux OS e requer as seguintes bibliotecas -
Sablot
Iconv
Expatriados
XSLT4R
O XSLT4R é escrito por Michael Neumann e pode ser encontrado no RAA na seção
Library em XML. O XSLT4R usa uma interface de linha de comando simples, embora
possa ser usado alternativamente em um aplicativo de terceiros para transformar um
documento XML.
O XSLT4R precisa que o XMLScan opere, que está incluído no arquivo XSLT4R e que
também é um módulo 100 por cento Ruby. Esses módulos podem ser instalados usando
o método de instalação padrão do Ruby (por exemplo, ruby install.rb).
Se você quiser usar o XSLT4R dentro de um aplicativo, você pode incluir o XSLT e
inserir os parâmetros necessários. Aqui está o exemplo -
require "xslt"
stylesheet = File.readlines("stylesheet.xsl").to_s
xml_doc = File.readlines("document.xml").to_s
arguments = { 'image_dir' => '/....' }
sheet = XSLT::Stylesheet.new( stylesheet, arguments )
# output to StdOut
sheet.apply( xml_doc )
# output to 'str'
str = ""
sheet.output = [ str ]
sheet.apply( xml_doc )
Leitura Adicional
Para obter detalhes completos sobre o REXML Parser, consulte a documentação
padrão da documentação do REXML Parser .
Você pode baixar o XSLT4R do Repositório RAA .
Ele usa XML para codificar as informações que fazem a chamada de procedimento
remoto e HTTP para transportar essas informações através de uma rede de clientes
para servidores e vice-versa.
O SOAP tem várias vantagens sobre outras tecnologias como COM, CORBA, etc: por
exemplo, seus custos relativamente baixos de implantação e depuração, sua
extensibilidade e facilidade de uso, e a existência de várias implementações para
diferentes linguagens e plataformas.
Por favor, consulte o nosso simples tutorial SOAP para entendê-lo em detalhes.
Este capítulo o familiariza com a implementação do SOAP para Ruby (SOAP4R). Este é
um tutorial básico, portanto, se você precisar de um detalhamento profundo, precisará
consultar outros recursos.
Instalando o SOAP4R
SOAP4R é a implementação SOAP para Ruby desenvolvida por Hiroshi Nakamura e pode
ser baixada de -
NOTA - Pode haver uma grande chance de você já ter instalado este componente.
Download SOAP
Se você está ciente do utilitário gem , então você pode usar o seguinte comando para
instalar o SOAP4R e os pacotes relacionados.
Eles podem ser escritos como métodos simples de Ruby. Por exemplo, vamos escrever
dois métodos para adicionar dois números e dividir dois números -
# Handler methods
def add(a, b)
return a + b
end
def div(a, b)
return a / b
end
end
1 receptor
paramArg
add_method(self, 'aMeth', [
%w(in inParam),
%w(inout inoutParam),
%w(out outParam),
%w(retval return)
])
myServer.start
Nome do servidor
1
Um nome de servidor, você pode dar o que você mais gosta.
2 Aqui urn: ruby é constante, mas você pode dar um nome exclusivo de
ServiceName para este servidor.
3 nome de anfitrião
porta
4
Um número de porta disponível a ser usado para o serviço da web.
Exemplo
Agora, usando as etapas acima, vamos escrever um servidor autônomo -
require "soap/rpc/standaloneserver"
begin
class MyServer < SOAP::RPC::StandaloneServer
# Handler methods
def add(a, b)
return a + b
end
def div(a, b)
return a / b
end
end
server = MyServer.new("MyServer",
'urn:ruby:calculation', 'localhost', 8080)
trap('INT){
server.shutdown
}
server.start
rescue => err
puts err.message
end
Agora, você pode executar este servidor em segundo plano da seguinte maneira -
$ ruby MyServer.rb&
A seguir está a informação mínima que você precisaria para chamar um serviço SOAP -
Agora, vamos escrever um cliente SOAP que chamaria métodos de serviço definidos no
exemplo acima, chamados add e div .
endPoint
1
URL do servidor SOAP para se conectar.
nameSpace
2 O namespace a ser usado para todos os RPCs feitos com esse objeto SOAP ::
RPC :: Driver.
sabãoAção
driver.add_method(name, *paramArg)
nome
1
O nome do método de serviço da web remoto.
2 paramArg
Especifica os nomes dos parâmetros dos procedimentos remotos.
result = driver.serviceMethod(paramArg...)
Aqui serviceMethod é o método de serviço web real e paramArg ... são os parâmetros
de lista necessários para passar no método de serviço.
Exemplo
Com base nos passos acima, vamos escrever um cliente SOAP da seguinte forma -
#!/usr/bin/ruby -w
require 'soap/rpc/driver'
NAMESPACE = 'urn:ruby:calculation'
URL = 'http://localhost:8080/'
begin
driver = SOAP::RPC::Driver.new(URL, NAMESPACE)
Leituras Adicionais
Eu expliquei apenas conceitos muito básicos de Web Services com Ruby. Se você quiser
aprofundá-lo ainda mais, há um link a seguir para encontrar mais detalhes sobre os
Serviços da Web com o Ruby .
Ruby - Guia de Tk
Introdução
A interface gráfica padrão do usuário (GUI) para Ruby é Tk. Tk começou como a GUI
para a linguagem de script Tcl desenvolvida por John Ousterhout.
Instalação
As ligações do Ruby Tk são distribuídas com o Ruby, mas o Tk é uma instalação
separada. Os usuários do Windows podem baixar uma instalação Tk de um único clique
do ActiveTcl da ActiveState .
Os usuários de Mac e Linux podem não precisar instalá-lo porque existe uma grande
chance de que ele já esteja instalado junto com o SO, mas se não, você pode baixar
pacotes pré-construídos ou obter o código-fonte do Tcl Developer Xchange .
Aplicação Tk Simples
Uma estrutura típica para programas Ruby / Tk é criar a janela principal ou raiz (uma
instância do TkRoot), adicionar widgets a ela para construir a interface do usuário e, em
seguida, iniciar o loop de eventos principal chamando Tk.mainloop .
require 'tk'
Aqui, depois de carregar o módulo de extensão tk, criamos um quadro de nível raiz
usando TkRoot.new . Em seguida, criamos um widget TkLabel como filho do quadro
raiz, definindo várias opções para o rótulo. Finalmente, nós empacotamos o root frame
e entramos no loop principal do evento GUI.
Aqui está uma lista de todas as opções de configuração padrão, que podem ser
aplicáveis a qualquer widget Ruby / Tk.
Existem outras opções específicas do widget, que seriam explicadas junto com
os widgets.
Existem três geometry managers place, grid e pack que são responsáveis por controlar
o tamanho e a localização de cada um dos widgets na interface.
Ruby / Tk cuida da gestão deste evento para você. Ele irá descobrir em qual widget o
evento se aplica (o usuário clicou neste botão? Se uma tecla foi pressionada, qual caixa
de texto tinha o foco?), E despacha-a de acordo. Widgets individuais sabem como
responder a eventos, portanto, por exemplo, um botão pode mudar de cor quando o
mouse se move sobre ele e reverter quando o mouse sai.
Em um nível mais alto, Ruby / Tk invoca callbacks em seu programa para indicar que
algo significativo aconteceu com um widget. Para ambos os casos, você pode fornecer
um bloco de código ou um objeto Ruby Proc que especifica como o aplicativo responde
ao evento ou callback.
Vamos dar uma olhada em como usar o método bind para associar eventos básicos do
sistema de janelas com os procedimentos Ruby que os manipulam. A forma mais
simples de ligação recebe como entrada uma string indicando o nome do evento e um
bloco de código que o Tk usa para manipular o evento.
Por exemplo, para capturar o evento ButtonRelease para o primeiro botão do mouse em
algum widget, você escreveria -
someWidget.bind('ButtonRelease-1') {
....code block to handle this event...
}
Assim, por exemplo, para capturar o evento que é gerado quando o usuário mantém
pressionada a tecla Ctrl e clica no botão direito do mouse.
helpButton = TkButton.new(buttonFrame) {
text "Help"
command proc { showHelp }
}
helpButton = TkButton.new(buttonFrame) {
text "Help"
command { showHelp }
}
Você pode usar os seguintes tipos básicos de eventos em seu aplicativo Ruby /
Tk -
O método de configuração
O método configure pode ser usado para definir e recuperar quaisquer valores de
configuração do widget. Por exemplo, para alterar a largura de um botão, você pode
chamar o método configure a qualquer momento da seguinte forma:
require "tk"
button = TkButton.new {
text 'Hello World!'
pack
}
button.configure('activebackground', 'blue')
Tk.mainloop
Para obter o valor de um widget atual, basta fornecê-lo sem um valor da seguinte
forma:
color = button.configure('activebackground')
Você também pode chamar o configure sem nenhuma opção, o que lhe dará uma
listagem de todas as opções e seus valores.
O método cget
Para simplesmente recuperar o valor de uma opção, configure retorna mais informações
do que você geralmente deseja. O método cget retorna apenas o valor atual.
color = button.cget('activebackground')
Ruby 1.8.x (pelo menos 1.8.2 se você quiser usar o ldap / control).
OpenLDAP, Netscape SDK, Windows 2003 ou Windows XP.
Agora, você pode usar o método de instalação padrão do Ruby. Antes de começar, se
você quiser ver as opções disponíveis para o extconf.rb, execute-o com a opção '--help'.
host - Esse é o ID do host que está executando o diretório LDAP. Nós vamos
tomá-lo como localhost .
porta - esta é a porta que está sendo usada para o serviço LDAP. As portas
LDAP padrão são 636 e 389. Verifique se a porta está sendo usada em seu
servidor, caso contrário, você poderá usar LDAP :: LDAP_PORT.
Esta chamada retorna uma nova conexão LDAP :: Conn para o servidor, host , na porta
port .
Etapa 2 - Encadernação
É aqui que geralmente especificamos o nome de usuário e a senha que usaremos para
o restante da sessão.
A seguir está a sintaxe para vincular uma conexão LDAP, usando o método DN, dn ,
credential, pwd e bind, método -
Você pode usar o mesmo método sem um bloco de código. Nesse caso, você precisaria
desvincular a conexão explicitamente da seguinte maneira -
Exemplo
#/usr/bin/ruby -w
require 'ldap'
$HOST = 'localhost'
$PORT = LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT
Essa chamada retorna o objeto LDAP :: Mod , que pode ser passado para os métodos
da classe LDAP :: Conn, como Conn # add, Conn # add_ext, Conn # modify e Conn #
modify_ext.
conn.add(dn, attrs)
Este método adiciona uma entrada com o DN, dn e os atributos attrs . Aqui, attrs deve
ser uma matriz de objetos LDAP :: Mod ou um hash de pares de matriz de atributo /
valor.
Exemplo
#/usr/bin/ruby -w
require 'ldap'
$HOST = 'localhost'
$PORT = LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT
conn.perror("bind")
entry1 = [
LDAP.mod(LDAP::LDAP_MOD_ADD,'objectclass',['top','domain']),
LDAP.mod(LDAP::LDAP_MOD_ADD,'o',['TTSKY.NET']),
LDAP.mod(LDAP::LDAP_MOD_ADD,'dc',['localhost']),
]
entry2 = [
LDAP.mod(LDAP::LDAP_MOD_ADD,'objectclass',['top','person']),
LDAP.mod(LDAP::LDAP_MOD_ADD, 'cn', ['Zara Ali']),
LDAP.mod(LDAP::LDAP_MOD_ADD | LDAP::LDAP_MOD_BVALUES, 'sn',
['ttate','ALI', "zero\000zero"]),
]
begin
conn.add("dc = localhost, dc = localdomain", entry1)
conn.add("cn = Zara Ali, dc = localhost, dc = localdomain", entry2)
rescue LDAP::ResultError
conn.perror("add")
exit
end
conn.perror("add")
conn.unbind
conn.modify(dn, mods)
Este método modifica uma entrada com o DN, dn e os atributos, mods . Aqui, os mods
devem ser uma matriz de objetos LDAP :: Mod ou um hash de pares de matriz de
atributo / valor.
Exemplo
Para modificar o sobrenome da entrada, que adicionamos na seção anterior,
escreveríamos -
#/usr/bin/ruby -w
require 'ldap'
$HOST = 'localhost'
$PORT = LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT
conn.perror("bind")
entry1 = [
LDAP.mod(LDAP::LDAP_MOD_REPLACE, 'sn', ['Mohtashim']),
]
begin
conn.modify("cn = Zara Ali, dc = localhost, dc = localdomain", entry1)
rescue LDAP::ResultError
conn.perror("modify")
exit
end
conn.perror("modify")
conn.unbind
conn.delete(dn)
Exemplo
Para excluir a entrada Zara Mohtashim , que adicionamos na seção anterior,
escreveríamos:
#/usr/bin/ruby -w
require 'ldap'
$HOST = 'localhost'
$PORT = LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT
conn.perror("bind")
begin
conn.delete("cn = Zara-Mohtashim, dc = localhost, dc = localdomain")
rescue LDAP::ResultError
conn.perror("delete")
exit
end
conn.perror("delete")
conn.unbind
Este método modifica o RDN da entrada com DN, dn , dando a ele o novo RDN,
new_rdn . Se delete_old_rdn for true , o valor do RDN antigo será excluído da entrada.
Exemplo
Suponha que tenhamos a seguinte entrada -
#/usr/bin/ruby -w
require 'ldap'
$HOST = 'localhost'
$PORT = LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT
conn.perror("bind")
begin
conn.modrdn("cn = Zara Ali, dc = localhost, dc = localdomain", "cn = Zara Mohtashim", true)
rescue LDAP::ResultError
conn.perror("modrdn")
exit
end
conn.perror("modrdn")
conn.unbind
Exemplo
Aqui, vamos pesquisar toda a subárvore de entrada dc = localhost, dc = localdomain
para objetos de pessoa -
#/usr/bin/ruby -w
require 'ldap'
$HOST = 'localhost'
$PORT = LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT
conn.perror("bind")
begin
conn.search(base, scope, filter, attrs) { |entry|
# print distinguished name
p entry.dn
# print all attribute names
p entry.attrs
# print values of attribute 'sn'
p entry.vals('sn')
# print entry as Hash
p entry.to_hash
}
rescue LDAP::ResultError
conn.perror("search")
exit
end
conn.perror("search")
conn.unbind
Isso invoca o bloco de código fornecido para cada entrada correspondente em que a
entrada LDAP é representada por uma instância da classe LDAP :: Entry. Com o último
parâmetro de pesquisa, você pode especificar os atributos nos quais está interessado,
omitindo todos os outros. Se você passar nulo aqui, todos os atributos serão retornados
da mesma forma que "SELECT *" nos bancos de dados relacionais.
O método dn (alias para get_dn) da classe LDAP :: Entry retorna o nome distinto da
entrada, e com o método to_hash, você pode obter uma representação hash de seus
atributos (incluindo o nome distinto). Para obter uma lista dos atributos de uma
entrada, use o método attrs (alias para get_attributes). Além disso, para obter a lista
de valores de um atributo específico, use o método vals (alias para get_values).
Manipulando Erros
Ruby / LDAP define duas classes de exceção diferentes -
Em caso de erro, os métodos new, bind ou unbind levantam uma exceção LDAP
:: Error.
Ruby - Multithreading
Os programas tradicionais têm um único encadeamento de execução, as instruções ou
instruções que compõem o programa são executadas seqüencialmente até o término do
programa.
Exemplo
Aqui está um exemplo, que mostra como podemos usar o programa Ruby multi-
threaded.
#!/usr/bin/ruby
def func1
i = 0
while i<=2
puts "func1 at: #{Time.now}"
sleep(2)
i = i+1
end
end
def func2
j = 0
while j<=2
puts "func2 at: #{Time.now}"
sleep(1)
j = j+1
end
end
Não há necessidade de iniciar um thread após criá-lo, ele começa a ser executado
automaticamente quando os recursos da CPU se tornam disponíveis.
O valor da última expressão nesse bloco é o valor do encadeamento e pode ser obtido
chamando o método de valor do objeto Thread. Se o encadeamento tiver sido
executado até a conclusão, o valor retornará o valor do encadeamento imediatamente.
Caso contrário, o método value é bloqueado e não retorna até que o encadeamento
seja concluído.
Se você quiser que qualquer exceção não tratada em qualquer thread faça com que o
intérprete saia, defina o método de classe Thread.abort_on_exception como true .
t = Thread.new { ... }
t.abort_on_exception = true
Variáveis de Thread
Um thread pode acessar normalmente as variáveis que estão no escopo quando o
thread é criado. Variáveis locais para o bloco de um segmento são locais para o
segmento e não são compartilhadas.
Neste exemplo, cada thread registra o valor atual da contagem de variáveis em uma
variável threadlocal com a chave mycount .
Demonstração ao vivo
#!/usr/bin/ruby
count = 0
arr = []
10.times do |i|
arr[i] = Thread.new {
sleep(rand(0)/10.0)
Thread.current["mycount"] = count
count += 1
}
end
8, 0, 3, 7, 2, 1, 6, 5, 4, 9, count = 10
O thread principal aguarda que as sub-threads terminem e, em seguida, imprime o
valor da contagem capturada por cada uma.
Prioridades de Thread
O primeiro fator que afeta o agendamento de encadeamentos é a prioridade do
encadeamento: encadeamentos de alta prioridade são agendados antes de
encadeamentos de baixa prioridade. Mais precisamente, um encadeamento só obterá
tempo de CPU se não houver encadeamentos de prioridade mais alta esperando para
serem executados.
Você pode definir e consultar a prioridade de um objeto Ruby Thread com prioridade =
e prioridade . Um encadeamento recém-criado inicia na mesma prioridade que o
encadeamento que o criou. O thread principal começa na prioridade 0.
Exclusão de Thread
Se dois encadeamentos compartilharem acesso aos mesmos dados e pelo menos um
dos encadeamentos modificar esses dados, você deverá tomar cuidado especial para
garantir que nenhum encadeamento possa ver os dados em um estado inconsistente.
Isso é chamado de exclusão de thread .
Mutex é uma classe que implementa um bloqueio de semáforo simples para acesso
mutuamente exclusivo a algum recurso compartilhado. Ou seja, apenas um thread pode
conter o bloqueio em um determinado momento. Outros tópicos podem optar por
esperar na fila para que o bloqueio fique disponível ou simplesmente optar por obter
um erro imediato, indicando que o bloqueio não está disponível.
count1 = count2 = 0
difference = 0
counter = Thread.new do
loop do
count1 += 1
count2 += 1
end
end
spy = Thread.new do
loop do
difference += (count1 - count2).abs
end
end
sleep 1
puts "count1 : #{count1}"
puts "count2 : #{count2}"
puts "difference : #{difference}"
count1 : 1583766
count2 : 1583766
difference : 0
Demonstração ao vivo
#!/usr/bin/ruby
require 'thread'
mutex = Mutex.new
count1 = count2 = 0
difference = 0
counter = Thread.new do
loop do
mutex.synchronize do
count1 += 1
count2 += 1
end
end
end
spy = Thread.new do
loop do
mutex.synchronize do
difference += (count1 - count2).abs
end
end
end
sleep 1
mutex.lock
puts "count1 : #{count1}"
puts "count2 : #{count2}"
puts "difference : #{difference}"
count1 : 696591
count2 : 696591
difference : 0
Manipulando Deadlock
Quando começamos a usar objetos Mutex para exclusão de encadeamentos, devemos
ter cuidado para evitar o impasse . Deadlock é a condição que ocorre quando todos os
threads estão aguardando para adquirir um recurso mantido por outro thread. Como
todos os segmentos estão bloqueados, eles não podem liberar os bloqueios que eles
mantêm. E porque eles não podem liberar os bloqueios, nenhum outro segmento pode
adquirir esses bloqueios.
Exemplo
Demonstração ao vivo
#!/usr/bin/ruby
require 'thread'
mutex = Mutex.new
cv = ConditionVariable.new
a = Thread.new {
mutex.synchronize {
puts "A: I have critical section, but will wait for cv"
cv.wait(mutex)
puts "A: I have critical section again! I rule!"
}
}
b = Thread.new {
mutex.synchronize {
puts "B: Now I am critical, but am done with cv"
cv.signal
puts "B: I am still critical, finishing up"
}
}
a.join
b.join
Estados da linha
Existem cinco possíveis valores de retorno correspondentes aos cinco estados possíveis,
conforme mostrado na tabela a seguir. O status status retorna o estado do
encadeamento.
Runnable corre
adormecido adormecido
Abortando abortando
Terminado normalmente falso
Thread.abort_on_exception = true
#!/usr/bin/ruby
Uma lista completa de funções internas é dada aqui para sua referência -
num = 12.40
puts num.floor # 12
puts num + 10 # 22.40
puts num.integer? # false as num is a float.
Isso produzirá o seguinte resultado -
12
22.4
false
Assumindo, n é um número -
A seguir, o exemplo de uso. Assumindo que main.rb existe com permissões de leitura,
gravação e não execução -
Demonstração ao vivo
#!/usr/bin/ruby
true
false
false
Os valores na maioria das variáveis predefinidas podem ser acessados por meios
alternativos.
$!
2 $@
O backtrace de pilha para a última exceção levantada. As informações de
rastreamento de pilha podem ser recuperadas pelo método Exception #
backtrace da última exceção.
$/
$\
4
O separador de registro de saída (nulo por padrão).
$,
$;
6 O separador padrão para divisão (nulo por padrão). Você pode especificar o
separador explicitamente para String # split.
$.
$<
8
Sinônimo para ARGF.
$>
9
Sinônimo para $ defout.
$0
10
O nome do atual programa Ruby sendo executado.
$$
11
O processo pid do atual programa Ruby sendo executado.
$?
12
O status de saída do último processo foi finalizado.
13 $:
$ DEBUG
14
Verdadeiro se a opção de linha de comando -d ou --debug for especificada.
$ defout
15
A saída de destino para print e printf ( $ stdout por padrão).
$F
$ FILENAME
$ LOAD_PATH
$ SAFE
O nível de segurança
$ stdin
20
Entrada padrão (STDIN por padrão).
21 $ stdout
Saída padrão (STDOUT por padrão).
$ stderr
22
Erro padrão (STDERR por padrão).
$ VERBOSE
$-x
$ -0
25
O valor da opção do interpretador -x e alias de $ /.
$ -a
$ -d
27
O valor da opção do interpretador -x e alias de $ DEBUG
$ -F
28
O valor da opção do interpretador -x e o alias de $ ;.
$ -i
$ -I
30
O valor da opção do interpretador -x e alias de $:.
$ -l
$_
33
A variável local, última string lida por gets ou readline no escopo atual.
$~
$ n ($ 1, $ 2, $ 3 ...)
$E
$`
$'
$+
Sinônimo de verdadeiro.
FALSO
2
Sinônimo de falso.
NADA
3
Sinônimo para nil.
ARGF
ARGV
DADOS
ENV
RUBY_PLATFORM
8
Uma string indicando a plataforma do interpretador Ruby.
RUBY_RELEASE_DATE
9
Uma string indicando a data de lançamento do interpretador Ruby
RUBY_VERSION
10
Uma string indicando a versão do interpretador Ruby.
STDERR
11
Fluxo de saída de erro padrão. Valor padrão de $ stderr .
12 STDIN
STDOUT
13
Fluxo de saída padrão. Valor padrão de $ stdout.
TOPLEVEL_BINDING
14
Um objeto de ligação no nível superior do Ruby.
Essas ferramentas ajudam você a depurar e melhorar seus programas Ruby sem gastar
muito esforço. Este tutorial lhe dará um bom começo com essas ferramentas.
RubyGems -
Depurador Ruby -
O irb (Interactive Ruby) foi desenvolvido por Keiju Ishitsuka. Ele permite que
você insira comandos no prompt e faça o interpretador responder como se você
estivesse executando um programa. O irb é útil para experimentar ou explorar o
Ruby.
Ruby Profiler -
Para mais informações sobre ferramentas e recursos Ruby, dê uma olhada nos
Recursos Úteis do Ruby .