Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Ruby é uma linguagem de programação pura orientada a objetos. Foi criado em 1993 por
Yukihiro Matsumoto do Japão.
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. O 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.
Ruby pode ser usado para escrever scripts CGI (Common Gateway Interface).
O Ruby possui uma sintaxe limpa e fácil que permite que um novo desenvolvedor
aprenda de maneira rápida e fácil.
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.
Para executar os exemplos discutidos neste tutorial, vocêFerramentas que você precisará
precisará de um computador mais recente como o Intel Core i3
ou i5 com um mínimo de 2 GB de RAM (recomenda-se 4 GB de RAM). Você também
precisará do seguinte software -
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 próximo capítulo orienta você para onde você pode obter Ruby e suaO que é o próximo?
documentação. Finalmente, ele instrui sobre como instalar o Ruby e
preparar um ambiente para desenvolver aplicativos Ruby.
Se você ainda estiver disposto a configurar seu ambiente para aConfiguração do ambiente local
linguagem de programação Ruby, então vamos continuar. Este
tutorial ensinará todos os tópicos importantes relacionados à configuração do ambiente.
Recomendamos que você analise os tópicos a seguir primeiro e, em seguida, prossiga.
Instalação Ruby no Linux / Unix - Se você está planejando ter seu ambiente de
desenvolvimento no Linux / Unix Machine, então siga este capítulo.
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.
Para escrever seus programas Ruby, você precisará de um editor - Editores de rubis populares
Se você estiver trabalhando na máquina Windows, poderá usar qualquer editor de
texto simples como o Bloco de notas ou Editar mais.
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.
O Ruby Interativo (IRb) fornece um shell para experimentação. Dentro Ruby Interativo (IRb)
do shell IRb, você pode visualizar imediatamente os resultados da
expressão, linha por linha.
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.
Nós assumimos que agora você tem um Ambiente Ruby funcional e vocêO que é o próximo?
está pronto para escrever o primeiro Programa Ruby. O próximo capítulo
ensinará como escrever programas em Ruby.
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.
#!/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.
Se o terminador for citado, o tipo de aspas determina o tipo do literal da cadeia orientada a
linhas. Observe que não deve haver espaço entre << e o terminador.
#!/usr/bin/ruby -w
print <<EOF
This is the first way of creating
here document ie. multiple line string.
EOF
BEGIN {
code
}
#!/usr/bin/ruby
BEGIN {
puts "Initializing Ruby Program"
}
END {
code
}
#!/usr/bin/ruby
END {
puts "Terminating Ruby Program"
}
BEGIN {
puts "Initializing Ruby Program"
}
Um comentário oculta uma linha, parte de uma linha ou várias linhas doComentários Ruby
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 -
name = "Madisetti" # This is again comment
# 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
Um programa orientado a objeto envolve classes e objetos. Uma classe é o plano a partir do
qual objetos individuais são criados. Em termos orientados a objetos, dizemos que sua
bicicleta é uma instância da classe de objetos conhecidos como bicicletas.
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 {
}
}
Atribuindo 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 uma 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.
Para implementar a programação orientada a objetos usando oDefinindo uma classe em Ruby
Ruby, você precisa primeiro aprender como criar objetos e
classes no Ruby.
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 .
class Customer
@@no_of_customers = 0
end
Objetos são instâncias da classe. Agora vocêCriando Objetos em Ruby usando o novo método
aprenderá a criar objetos de uma classe em Ruby.
Você pode criar objetos em Ruby usando o método new da classe.
O método new é um tipo exclusivo de método, que é predefinido na biblioteca Ruby. O novo
método pertence aos métodos de classe .
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 (=) após o qual o nome da classe se seguirá. Em seguida, o operador de
ponto e a palavra-chave new serão seguidos.
Você pode passar parâmetros para o método new eMétodo Customizado para Criar Objetos Ruby
esses parâmetros podem ser usados para inicializar
variáveis de classe.
Quando você planeja declarar o novo método com parâmetros, você precisa 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.
Em Ruby, as funções são chamadas de métodos. Cada Funções de membro na classe Ruby
método em uma classe começa com a palavra-chave def
seguida do nome do 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 -
#!/usr/bin/ruby
class Sample
def hello
puts "Hello Ruby!"
end
end
Hello Ruby!
Aqui está um estudo de caso se você quiser praticar mais com classes Estudo de caso simples
e objetos.
Variáveis são os locais da memória, que contêm todos os dados a serem usados por
qualquer programa.
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.
Variáveis globais começam com $. Variáveis globais não inicializadasVariáveis Globais Ruby
têm o valor nulo e produzem avisos com a opção -w.
A atribuição a variáveis globais altera o status global. Não é recomendado usar variáveis
globais. Eles tornam os programas enigmáticos.
#!/usr/bin/ruby
$global_variable = 10
class Class1
def print_global
puts "Global variable in Class1 is #$global_variable"
end
end
class Class2
def print_global
puts "Global variable in Class2 is #$global_variable"
end
end
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()
Customer id 1
Customer name John
Customer address Wisdom Apartments, Ludhiya
Customer id 2
Customer name Poul
Customer address New Empire road, Khandala
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.
#!/usr/bin/ruby
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()
Variáveis locais começam com uma letra minúscula ou _. O escopo deVariáveis locais do Ruby
uma variável local varia de classe, módulo, def ou do para o final
correspondente ou da chave de abertura de um bloco para sua chave de fechamento {}.
Quando uma variável local não inicializada é referenciada, ela é interpretada como uma
chamada para um método que não possui argumentos.
A atribuição a variáveis locais não inicializadas também serve como declaração variável. As
variáveis começam a existir até o final do escopo atual ser atingido. O tempo de vida de
variáveis locais é determinado quando Ruby analisa o programa.
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.
#!/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
Eles são variáveis especiais que têm a aparência de variáveis locais,Pseudo-Variáveis Ruby
mas se comportam como constantes. Você não pode atribuir nenhum
valor a essas variáveis.
As regras que Ruby usa para literais são simples e intuitivas. Esta seçãoRuby Basic Literais
explica todos os literais básicos de Ruby.
Ruby suporta números inteiros. Um número inteiro pode variar de -2 30 a 2Números inteiros
30-1 ou -2 62 a 2 62-1 . 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.
Você também pode obter o valor inteiro, correspondente a um caractere ASCII ou escapar
da sequência, precedendo-o com um ponto de interrogação.
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 Números Flutuantes
qualquer um dos seguintes -
Strings Ruby são simplesmente seqüências de bytes de 8 bits e são objetosLiterais de cordas
da classe String. As strings com aspas duplas permitem a notação de
substituição e contrabarra, mas as strings com aspas simples não permitem a substituição e
permitem a notação de contrabarra apenas para \\ e \ '
#!/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.
#!/usr/bin/ruby -w
A seguir está a lista de notações de barra invertida suportadas peloNotações de barra invertida
Ruby -
\n Newline (0x0a)
\f Formfeed (0x0c)
\b Backspace (0x08)
\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 .
Literais de Ruby Array são criados colocando-se uma série de referências deRuby Arrays
objetos separados por vírgula entre os colchetes. Uma vírgula final é ignorada.
#!/usr/bin/ruby
fred
10
3.14
This is a string
last element
Um literal Ruby Hash é criado colocando uma lista de pares chave / valor entreHashes Ruby
chaves, com uma vírgula ou a sequência => entre a chave e o valor. Uma
vírgula final é ignorada.
#!/usr/bin/ruby
hsh = colors = { "red" => 0xf00, "green" => 0x0f0, "blue" => 0x00f }
hsh.each do |key, value|
print key, " is ", value, "\n"
end
Isso produzirá o seguinte resultado -
red is 3840
green is 240
blue is 15
Para mais detalhes sobre Ruby Hashes, passe por Ruby Hashes .
Ranges 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.
#!/usr/bin/ruby
(10..15).each do |n|
print n, ' '
end
10 11 12 13 14 15
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 abreviada (+ = - = etc.).
Usado para testar a igualdade dentro de uma (1 ... 10) === 5 retorna
===
cláusula when de uma instrução case . verdadeiro.
Ruby também suporta a atribuição paralela de variáveis. Isso Atribuição Paralela ao Ruby
permite que várias variáveis sejam inicializadas com uma única
linha de código Ruby. Por exemplo -
a = 10
b = 20
c = 30
a, b, c = 10, 20, 30
A atribuição paralela também é útil para trocar os valores mantidos em duas variáveis -
a, b = b, c
O operador bit a bit trabalha em bits e executa a operação bit a bit. Operadores Bitwise Ruby
a = 0011 1100
b = 0000 1101
------------------
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011
Binário OU Operador copia um bit se existir em (a | b) vai dar 61, que é 0011
|
um dos operandos. 1101
Operador XOR binário copia o bit se estiver (a ^ b) dará 49, que é 0011 0001
^ definido em um operando, mas não em
ambos.
Os seguintes operadores lógicos são suportados pela linguagem Ruby Operadores Lógicos Ruby
Operador NÃO Lógico Chamado. Use para inverter o estado lógico ! (a && b) é
! do seu operando. Se uma condição for verdadeira, o operador falso.
Lógico NOT tornará falso.
Operador NÃO Lógico Chamado. Use para inverter o estado lógico não (a && b) é
não do seu operando. Se uma condição for verdadeira, o operador falso.
Lógico NOT tornará falso.
Os intervalos de sequência em Ruby são usados para criar umOperadores Ruby Range
intervalo de valores sucessivos - consistindo em um valor inicial, um
valor final e um intervalo de valores entre eles.
Em Ruby, essas seqüências são criadas 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.
Por exemplo
foo = 42
defined? foo # => "local-variable"
defined? $_ # => "global-variable"
defined? bar # => nil (undefined)
Por exemplo
Por exemplo
Por exemplo
Você chama um método de módulo precedendo seue dois-pontos "::" operadores Ruby Dot "."
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.
Lembre-se de que Ruby, classes e métodos podem ser considerados constantes também.
Você precisa apenas prefixar o :: Const_name com uma expressão que retorne a classe ou
objeto de módulo apropriado.
Se nenhuma expressão de prefixo é usada, a classe de objeto principal é usada por padrão.
Segundo exemplo
|| Logical 'OR'
?: Ternário se-então-mais
=% = {= = - = + = | = & =
>> = << = * = && = || = ** Tarefa
=
ou e Composição lógica
Comentários são linhas de anotação 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 -
#!/usr/bin/ruby -w
# This is a single line comment.
Hello, Ruby!
Você pode comentar várias linhas usando a sintaxe = begin e = Ruby Multiline Comentários
end da seguinte maneira -
#!/usr/bin/ruby -w
=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!
O Ruby oferece estruturas condicionais que são bastante comuns em linguagens modernas.
Aqui, vamos explicar todas as instruções e modificadores condicionais disponíveis no Ruby.
if conditional [then]
code...
[elsif conditional [then]
code...]...
[else
code...]
end
se expressões são usadas para execução condicional. Os valores falso e nulo são falsos e
tudo o mais é verdadeiro. Observe que Ruby usa elsif, não mais se nem elif.
#!/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
code if condition
#!/usr/bin/ruby
$debug = 1
print "debug\n" if $debug
debug
#!/usr/bin/ruby
x = 1
unless x>=2
puts "x is less than 2"
else
puts "x is greater than 2"
end
x is less than 2
#!/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 expression
[when expression [, expression ...] [then]
code ]...
[else
code ]
end
Quando a expressão de uma instrução é separada do código pela palavra reservada, uma
nova linha ou um ponto-e-vírgula. Assim -
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
#!/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
Os 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.
#!/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.
#!/usr/bin/ruby
$i = 0
$num = 5
begin
puts("Inside the loop i = #$i" )
$i +=1
end while $i < $num
#!/usr/bin/ruby
$i = 0
$num = 5
OR
begin
code
end until conditional
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.
#!/usr/bin/ruby
$i = 0
$num = 5
begin
puts("Inside the loop i = #$i" )
$i +=1;
end until $i > $num
#!/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
no intervalo de 0 a 5 (incluindo 5). Isso produzirá o seguinte resultado -
exceto que um loop for não cria um novo escopo para variáveis locais. A expressão do loop
for é separada do código pela palavra reservada do, uma nova linha ou um ponto e vírgula.
#!/usr/bin/ruby
(0..5).each do |i|
puts "Value of local variable is #{i}"
end
Termina o loop mais interno. Encerra um método com um bloco associado, se chamado
dentro do bloco (com o método retornando nil).
#!/usr/bin/ruby
for i in 0..5
if i > 2 then
break
end
puts "Value of local variable is #{i}"
end
next
Salta para a próxima iteração do loop mais interno. Encerra a execução de um bloco se
chamado dentro de um bloco (com rendimento ou retorno de chamada nulo).
#!/usr/bin/ruby
for i in 0..5
if i < 2 then
next
end
puts "Value of local variable is #{i}"
end
redo
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.
#!/usr/bin/ruby
for i in 0..5
if i < 2 then
puts "Value of local variable is #{i}"
redo
end
end
retry
begin
do_something # exception raised
rescue
# handles error
retry # restart from beginning
end
for i in 1..5
retry if some_condition # restart from i == 1
end
#!/usr/bin/ruby
for i in 0..5
retry if i > 2
puts "Value of local variable is #{i}"
end
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
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
No entanto, quando você chama um método com parâmetros, escreve o nome do método
junto com os parâmetros, como -
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.
#!/usr/bin/ruby
Todo método em Ruby retorna um valor por padrão. Este valorRetornar valores de métodos
retornado será o valor da última declaração. Por exemplo -
def test
i = 100
j = 10
k = 0
end
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.
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
Suponha que você declare um método que usa dois parâmetros,Número Variável de Parâmetros
sempre que você chamar esse método, precisará passar dois
parâmetros junto com ele.
No entanto, Ruby permite declarar métodos que funcionam com um número variável de
parâmetros. Vamos examinar uma amostra disso -
#!/usr/bin/ruby
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 -
Sempre que você quiser acessar um método de uma classe, primeiro você precisa instanciar
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
Veja como o método return_date é declarado. É declarado com o nome da classe seguido
por um período, que é seguido pelo nome do método. Você pode acessar este método de
classe diretamente da seguinte maneira -
Accounts.return_date
Para acessar este método, você não precisa criar objetos da classe Accounts.
Isto dá alias a métodos ou variáveis globais. Os aliases não podemDeclaração de alias do Ruby
ser definidos no corpo do método. O alias do método mantém a
definição atual do método, mesmo quando os métodos são substituídos.
Aqui definimos alias foo para bar, e $ MATCH é um apelido para $ &
Isso cancela a definição do método. Um undef não pode aparecer noRuby undef Statement
corpo do método.
undef bar
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.
Um bloco é sempre chamado de uma função com o mesmo nome do bloco. Isso
significa que, se você tiver um bloco com o nome test , use o teste de função para
chamar este bloco.
Sintaxe
block_name {
statement1
statement2
..........
}
Aqui, você aprenderá a invocar um bloco usando uma declaração de rendimento simples.
Você também aprenderá a usar uma instrução yield com parâmetros para invocar um bloco.
Você verificará o código de amostra com os dois tipos de declarações de rendimento .
#!/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 -
#!/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 é -
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 -
#!/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 instrução yield .
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 depois.
#!/usr/bin/ruby
def test(&block)
block.call
end
test { puts "Hello World!"}
Hello World!
Todo arquivo fonte do Ruby pode declarar blocos de código a serem executados enquanto o
arquivo está sendo carregado (os blocos BEGIN) e após o término da execução do programa
(os blocos END).
#!/usr/bin/ruby
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 -
Módulos são uma maneira de agrupar métodos, classes e constantes. Os módulos oferecem
dois grandes benefícios.
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.
#!/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
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.
require filename
Aqui, não é necessário fornecer extensão .rb junto com um nome de arquivo.
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 procurados 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.
IMPORTANTE - Aqui, os dois arquivos contêm o mesmo nome de função. Portanto, isso
resultará em ambigüidade de código, ao incluir no programa de chamada, mas os módulos
evitam a ambigüidade do código e podemos chamar a função apropriada usando o nome do
módulo.
Você pode incorporar um módulo em uma classe. Para incorporar um módulo em uma
classe, você usa a instrução include na classe -
include modulename
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
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.
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 .
Os Mixins oferecem uma maneira maravilhosamente controlada de adicionar funcionalidade
às classes. No entanto, o verdadeiro poder deles é exibido quando o código no mixin
começa a interagir com o código na classe que o utiliza.
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 .
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 -
#!/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 }."
Com strings delimitadas em geral, você pode criar strings dentro de um par de caracteres
delimitadores arbitrários, por exemplo,!, (, {, <, Etc., precedidos por um caractere
percentual (%). Q, qex têm significados especiais Cadeias delimitadas por geral podem ser -
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.
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'
Precisamos ter uma instância do objeto String para chamar um método String. A seguir está
a maneira de criar uma instância do objeto String -
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 -
#!/usr/bin/ruby
puts "#{foo}"
this is test
A seguir estão os métodos public String (Supondo que str seja um objeto String) -
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.
Há 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
#!/usr/bin/ruby
Você também pode usar um bloco com novo, preenchendo cada elemento com o que o bloco
avalia para -
#!/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 -
#!/usr/bin/ruby
digits = Array(0..9)
puts "#{digits}"
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Precisamos ter uma instância do objeto Array para chamar um método Array. Como vimos,
seguir é o caminho para criar uma instância do objeto Array -
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 -
#!/usr/bin/ruby
digits = Array(0..9)
num = digits.at(6)
puts "#{num}"
A seguir estão os métodos de matriz pública (supondo que matriz seja um objeto de
matriz) -
A tabela a seguir lista as diretivas de pacote para uso com o Array # pack.
Tente o exemplo a seguir para compactar vários dados.
a b c
abc
ABC
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 em que 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 .
Assim como nos arrays, há várias 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 possui um valor padrão, se a chave
ou o valor não existir, o acesso ao hash retornará o valor padrão -
#!/usr/bin/ruby
puts "#{months[0]}"
puts "#{months[72]}"
Isso produzirá o seguinte resultado -
month
month
#!/usr/bin/ruby
puts "#{H['a']}"
puts "#{H['b']}"
100
200
Você pode usar qualquer objeto Ruby como chave ou valor, até mesmo um array, então o
exemplo a seguir é válido -
Precisamos ter uma instância do objeto Hash para chamar um método Hash. Como vimos,
seguir é o caminho para criar uma instância do objeto Hash -
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 -
#!/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) -
Testa se dois hashes são iguais, com base em se eles têm o mesmo número de
1
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 .
hash.default_proc
7
Retorna um bloco se o hash foi criado por um bloco.
9 Exclui um par de valores-chave do hash para cada par que o bloco avalia como
verdadeiro .
11 Itera sobre hash , chamando o bloco uma vez para cada chave, passando a chave
como um 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?
14 Testa se o hash está vazio (não contém pares de valores-chave), retornando true
ou false .
15
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.
Testa se uma determinada chave está presente no hash, retornando true ou false .
hash.has_value? (valor)
17
Testa se o hash contém o valor fornecido .
hash.index (valor)
Retorna um novo array que consiste em valores para a (s) chave (s) dada (s). Irá
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). Irá
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
22 Cria um novo hash , invertendo chaves e valores do hash ; ou seja, no novo hash,
as chaves do hash se tornam valores e valores tornam-se chaves.
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.reject {| chave, valor | quadra }
28
Cria um novo hash para cada par que o bloco avalia como verdadeiro
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 de valor-chave 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
36 Cria um array bidimensional a partir do hash. Cada par chave / valor é convertido
em um array, e todos esses arrays são armazenados em um array contendo.
hash.to_hash
37
Retorna o hash (self).
hash.to_s
38
Converte o hash em uma matriz e, em seguida, converte essa matriz em uma
string.
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 .
A classe Time representa datas e horas em Ruby. É uma camada fina sobre a
funcionalidade de data e hora do sistema fornecida pelo sistema operacional. Esta classe
pode não conseguir em seu sistema representar datas antes de 1970 ou depois de 2038.
Este capítulo familiariza você com todos os conceitos de data e hora mais desejados.
A seguir, o exemplo simples para obter data e hora atuais - Obtendo a data e hora atuais
#!/usr/bin/ruby -w
time1 = Time.new
puts "Current Time : " + time1.inspect
# Time.now is a synonym:
time2 = Time.now
puts "Current Time : " + time2.inspect
#!/usr/bin/ruby -w
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
Essas duas funções podem ser usadas para formatar a data em um formato padrão da
seguinte maneira -
# 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)
A seguir, o exemplo para obter todos os componentes em uma matriz no seguinte formato -
[sec,min,hour,day,month,year,wday,yday,isdst,zone]
Tente o seguinte -
#!/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:
#!/usr/bin/ruby -w
time = Time.new
values = time.to_a
puts Time.utc(*values)
Você pode usar um objeto Time para obter todas as informações relacionadas a fusos
horários e horário de verão da seguinte maneira:
time = Time.new
#!/usr/bin/ruby -w
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).
%b
3
O nome abreviado do mês (Jan).
%B
4
O nome completo do mês (janeiro).
%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Ê
%W
%W
16
Dia da semana (domingo é 0, 0 a 6).
%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%.
O primeiro e talvez o uso mais natural de intervalos é expressar uma sequência. Seqüências
têm um ponto inicial, um ponto final e uma maneira de produzir valores sucessivos na
seqüência.
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'
A sequência 1..100 é mantida como um objeto Range contendo referências a dois objetos
Fixnum . Se precisar, você pode converter um intervalo em uma lista usando o método to_a
. Experimente o seguinte exemplo -
#!/usr/bin/ruby
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 -
#!/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
Os intervalos também podem ser usados como expressões condicionais. Por exemplo, o
fragmento de código a seguir imprime conjuntos de linhas da entrada padrão, em que a
primeira linha de cada conjunto contém a palavra início e a última linha em que a palavra
termina -
while gets
print if /start/../end/
end
#!/usr/bin/ruby
score = 70
puts result
Um uso final do intervalo versátil é como um teste de intervalo: ver se algum valor está
dentro do intervalo representado pelo intervalo. Isso é feito usando ===, o operador de
igualdade de casos.
#!/usr/bin/ruby
if ((1..10) === 5)
puts "5 lies in (1..10)"
end
5 lies in (1..10)
c lies in ('a'..'j')
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.
Iteradores retornam todos os elementos de uma coleção, um após o outro. Vamos discutir
dois iteradores aqui, cada um e coletar . Vamos ver isso em detalhes.
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 rubi.
#!/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.
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.
#!/usr/bin/ruby
a = [1,2,3,4,5]
b = Array.new
b = a.collect
puts b
1
2
3
4
5
NOTA - O método de coleta 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 .
#!/usr/bin/ruby
a = [1,2,3,4,5]
b = a.collect{|x| 10*x}
puts b
10
20
30
40
50
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 .
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.
#!/usr/bin/ruby
A instrução gets pode ser usada para obter qualquer entrada do usuário da tela padrão
chamada STDIN.
O código a seguir mostra como usar a instrução gets. Esse código solicitará que o usuário
insira um valor, que será armazenado em um val variável e, finalmente, será impresso no
STDOUT.
#!/usr/bin/ruby
Enter a value :
This is entered value
This is entered value
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.
#!/usr/bin/ruby
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.
#!/usr/bin/ruby
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.
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 .
Os mesmos métodos que utilizamos para E / S 'simples' estão disponíveis para todos os
objetos de arquivo. Portanto, o gets lê uma linha da entrada padrão e aFile.gets lê uma
linha do objeto de arquivo aFile.
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
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
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
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 de 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
na matriz arr. Portanto, arr [0] conterá a primeira linha, enquanto arr [1] conterá a segunda
linha do arquivo.
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.
Você pode renomear e excluir arquivos programaticamente com Ruby com os métodos
rename e delete .
#!/usr/bin/ruby
#!/usr/bin/ruby
Use o método chmod com uma máscara para alterar o modo ou permissões / lista de acesso
de um arquivo -
A seguir está o exemplo para alterar o modo de um arquivo test.txt existente para um valor
de máscara -
#!/usr/bin/ruby
A seguir está a tabela, que pode ajudá-lo a escolher uma máscara diferente para o
método chmod -
#!/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
File.size?( "text.txt" ) # => 1002
#!/usr/bin/ruby
O seguinte comando pode ser usado para descobrir quando um arquivo foi criado,
modificado ou acessado pela última vez -
#!/usr/bin/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
manipulados com a classe Dir .
Para alterar o diretório dentro de um programa Ruby, use Dir.chdir da seguinte maneira.
Este exemplo altera o diretório atual para / usr / bin .
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.entries retorna uma matriz com todas as entradas no diretório especificado. Dir.foreach
fornece o mesmo recurso -
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/*"]
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.
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")
Arquivos temporários são aqueles que podem ser criados brevemente durante a execução
de um programa, mas não são um armazenamento permanente de informações.
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
Aqui estão as funções embutidas do ruby para processar arquivos eFunções incorporadas
diretórios -
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 lidar com
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 begin / end e usar cláusulas de resgate 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 salvamento no bloco inicial, Ruby compara a exceção levantada com
cada um dos parâmetros. 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, temos permissão para usar uma cláusula else após todas as cláusulas de
resgate .
#!/usr/bin/ruby
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 pelo arquivo
porque a abertura falhou.
#<IO:0xb7d16f84>==#<IO:0xb7d16f84>
Você pode capturar uma exceção usando o bloco deUsando a declaração de repetição
recuperação e, em seguida, usar a instrução de repetição para
executar o bloco de início desde o início.
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
#!/usr/bin/ruby
begin
file = open("/unexistant_file")
if file
puts "File opened successfully"
end
rescue
fname = "existant_file"
retry
end
OBSERVAÇÃO - Observe que, se o arquivo de nome re-substituído não existir, este código
de exemplo será repetido infinitamente. Tenha cuidado se você usar novamente para um
processo de exceção.
Você pode usar a instrução raise para lançar uma exceção. O Usando declaração de aumento
método a seguir gera uma exceção sempre que é chamado. Sua
segunda mensagem será impressa.
raise
OR
OR
OR
O segundo formulário cria uma nova exceção RuntimeError , configurando sua mensagem
para a cadeia especificada. Esta exceção é então levantada a pilha de chamadas.
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.
#!/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.'
#!/usr/bin/ruby
begin
raise 'A test exception.'
rescue Exception => e
puts e.message
puts e.backtrace.inspect
end
A test exception.
["main.rb:4"]
Às vezes, você precisa garantir que algum processamento sejaUsando a declaração de garantia
feito no final de um bloco de código, independentemente de
uma exceção ter sido gerada. Por exemplo, você pode ter um arquivo aberto na entrada do
bloco e você precisa ter certeza de que ele será fechado quando o bloco sair.
A cláusula de garantia faz exatamente isso. assegura 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 dispara e resgata uma exceção, ou se ele é
terminado por uma exceção não identificada, o bloco de garantia será executado.
begin
#.. process
#..raise exception
rescue
#.. handle error
ensure
#.. finally ensure execution
#.. This will always execute.
end
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
Se a cláusula else está presente, ela vai após as cláusulas de resgate Usando outra declaração
e antes de qualquer garantia .
O corpo de uma cláusula else é executado apenas se nenhuma exceção for levantada pelo
corpo principal do código.
begin
#.. process
#..raise exception
rescue
# .. handle error
else
#.. executes if there is no exception
ensure
#.. finally ensure execution
#.. This will always execute.
end
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
Embora o mecanismo de exceção de raise e resgate seja ótimo para abandonarPegar e jogar
a execução quando as coisas dão errado, às vezes é bom poder saltar de
alguma construção profundamente aninhada durante o processamento normal. É aqui que o
catch e o throw são úteis.
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.
throw :lablename
#.. this will not be executed
catch :lablename do
#.. matching catch will be executed after a throw is encountered.
end
OR
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 -
As classes e módulos padrão do Ruby geram exceções. Todas as classes deExceção de Classe
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 neste nível, Fatal , mas o interpretador Ruby só usa isso
internamente.
Tanto ScriptError quanto StandardError possuem várias subclasses, mas não precisamos
entrar nos detalhes aqui. O importante é que, se criarmos nossas próprias classes de
exceção, elas precisam ser subclasses de qualquer exceção de classe ou um de seus
descendentes.
A linha importante aqui é raise FileSaveError.new ($!) . Chamamos raise para sinalizar que
ocorreu uma exceção, passando-lhe uma nova instância de FileSaveError, com o motivo de
essa exceção específica ter causado a falha na gravação dos dados.
Ruby é uma linguagem pura orientada a objetos e tudo parece para Ruby como um objeto.
Todo valor em Ruby é um objeto, até mesmo os mais primitivos: strings, números e até true
e false. Até mesmo uma classe em si é um objeto que é uma instância da classe Class . Este
capítulo irá levá-lo através de todas as principais funcionalidades relacionadas ao Ruby
Orientado a Objetos.
Quando você define uma classe, você define um blueprint para um tipo de dados. Isso não
define realmente nenhum dado, mas define o que o nome da classe significa, ou seja, em
que um objeto da classe consistirá e quais operações podem ser executadas em tal objeto.
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).
Uma classe fornece os blueprints para objetos, então, basicamente, um objeto é criado a
partir de uma classe. Nós declaramos objetos de uma classe usando uma nova palavra-
chave. As seguintes declarações declaram dois objetos da classe Box -
box1 = Box.new
box2 = Box.new
class Box
def initialize(w,h)
@width, @height = w, h
end
end
class Box
def initialize(w,h)
# assign instance variables
@width, @height = w, h
end
end
Para disponibilizar as variáveis fora da classe, elas devem ser definidas dentro dos métodos
acessadores , esses métodos acessadores também são conhecidos como métodos getter. O
exemplo a seguir mostra o uso de métodos de acesso -
#!/usr/bin/ruby -w
# 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 -
#!/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 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 somente como mostrado abaixo. Sua funcionalidade não se limita a acessar as
variáveis de instância, mas também podem fazer muito mais de acordo com sua
necessidade.
#!/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)
As variáveis de classe são uma variável, que é compartilhada entre todas as instâncias de
uma classe. Em outras palavras, há uma instância da variável e ela é acessada por
instâncias de objetos. Variáveis de classe são prefixadas com dois caracteres @ (@@). Uma
variável de classe deve ser inicializada dentro da definição de classe, conforme mostrado
abaixo.
#!/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
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 -
#!/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)
Métodos públicos - métodos públicos podem ser chamados por qualquer pessoa.
Os métodos são públicos por padrão, exceto para initialize, que é sempre privado.
Métodos privados - os métodos privados não podem ser acessados nem exibidos
de fora da turma. Apenas os métodos de classe podem acessar membros privados.
Métodos Protegidos - Um método protegido pode ser chamado apenas por objetos
da classe de definição e suas subclasses. O acesso é mantido dentro da família.
#!/usr/bin/ruby -w
# define a class
class Box
# constructor method
def initialize(w,h)
@width, @height = w, h
end
# create an object
box = Box.new(10, 20)
Quando o código acima é executado, produz o seguinte resultado. Aqui, o primeiro método
é chamado com sucesso, mas o segundo método deu um problema.
#!/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
# define a subclass
class BigBox < Box
# create an object
box = BigBox.new(10, 20)
#!/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
# define a subclass
class BigBox < Box
# create an object
box = BigBox.new(10, 20)
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
À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.
#!/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)
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.
#!/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)
Constantes de classe são herdadas e podem ser substituídas como métodos de instância.
Pode haver uma situação em que você deseja criar um objeto sem chamar seu construtor
de inicializar, ou seja, usando o novo método, nesse caso, você pode chamar allocate , que
criará um objeto não inicializado para você, como no exemplo a seguir -
#!/usr/bin/ruby -w
# 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
Se as definições de classe forem executáveis, isso significa que elas sãoInformações de Classe
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
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.
Uma expressão regular é uma sequência especial de caracteres que ajuda você a encontrar
ou encontrar outras strings ou conjuntos de strings usando uma sintaxe especializada
mantida em um padrão.
Sintaxe
/pattern/
/pattern/im # option can be specified
%r!/usr/local! # general delimited regular expression
#!/usr/bin/ruby
if ( line1 =~ /Cats(.*)/ )
puts "Line1 contains Cats"
end
if ( line2 =~ /Cats(.*)/ )
puts "Line2 contains Dogs"
end
Eu
1
Ignora o caso ao corresponder ao texto.
x
3
Ignora o espaço em branco e permite comentários em expressões regulares.
m
4
Corresponde a várias linhas, reconhecendo novas linhas como caracteres normais.
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 -
Classes de Personagem
Casos de Repetição
Referências de volta
Alternativas
Âncoras
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! .
Todos esses métodos executam uma operação de pesquisa e substituição usando um padrão
Regexp. O sub e sub! substitui a primeira ocorrência do padrão e gsub & gsub! substitui
todas as ocorrências.
O sub e o gsub retornam uma nova string, deixando o original não modificado como sub! e
gsub! Modifique a cadeia na qual eles são chamados.
#!/usr/bin/ruby
#!/usr/bin/ruby
Este capítulo ensina como acessar um banco de dados usando Ruby. O módulo Ruby DBI
fornece uma interface independente de banco de dados para scripts Ruby semelhantes aos
do módulo Perl DBI.
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
O DBI é independente de qualquer banco de dados disponível no back-end. Você pode usar
o DBI se estiver trabalhando com Oracle, MySQL ou Informix, etc. Isso fica claro no
diagrama de arquitetura a seguir.
Se você quiser escrever scripts Ruby para acessar bancos de dados MySQL,Pré-requisitos
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 -
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 do DBD do MySQL, emita o comando a seguir -
Supondo que vamos trabalhar com banco de dados MySQL, antes de conectar a um banco
de dados, certifique-se do seguinte -
#!/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, dbh é definido como valor
nulo e e.err e e :: errstr retornam código de erro e uma string de erro respectivamente.
Finalmente, antes de sair, certifique-se de que a conexão com o banco de dados esteja
fechada e os recursos sejam liberados.
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.
Instruções que não retornam linhas podem ser emitidas invocando o método do
manipulador 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
Você pode usar preparar e executar métodos da classe DBI para executar a instrução SQL
através do código Ruby.
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.
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 .
A seguir, o procedimento para consultar todos os registros da tabela EMPLOYEE com salário
maior que 1000.
#!/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.
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
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 .
Executando consulta SQL para excluir registros necessários do banco de dados. Isso
será feito usando o método de execução .
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
Durabilidade - Uma vez que uma transação foi confirmada, os efeitos são
persistentes, mesmo após uma falha do 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 -
dbh.commit
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 .
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.
Existem muitas fontes de erros. Alguns exemplos são um erro de sintaxeManipulando Erros
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 string de erro descritiva e um código de erro padrão.
Os atributos são explicados abaixo -
err - Retorna uma representação de inteiro do erro ocorrido ou nil se isto não for
suportado pelo DBD. O DBD do Oracle, por exemplo, retorna a parte numérica de
uma mensagem de erro ORA-XXXX .
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.
Existem alguns métodos que criam alças. Esses métodos podem ser chamados com um
bloco de códigos. A vantagem de usar o bloco de códigos junto com métodos é que eles
fornecem o identificador para o bloco de código como seu parâmetro e automaticamente
limpa o identificador quando o bloco termina. Existem alguns exemplos para entender o
conceito.
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 dbh.execute 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.
O DBI permite que os drivers do banco de dados forneçam funções adicionais específicas do
banco de dados, que podem ser chamadas pelo usuário através do método func de qualquer
objeto Handle.
Atributos específicos do driver são suportados e podem ser configurados ou obtidos usando
os métodos [] = ou [] .
#!/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
Ruby é uma linguagem de propósito geral; ele não pode ser chamado de linguagem da web
. Mesmo assim, aplicações web e ferramentas web em geral estão entre os usos mais
comuns do Ruby.
Não apenas 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.
#!/usr/bin/ruby
Aqui, quando test.cgi é solicitado a partir 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.
O Ruby vem com uma biblioteca especial chamada cgi que permite interações mais
sofisticadas do que aquelas com o script CGI anterior.
#!/usr/bin/ruby
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ê.
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.
Você pode acessar os parâmetros FirstName e LastName usando CGI # [] diretamente como
segue -
#!/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"]
#!/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>
O CGI contém um grande número de métodos usados para criar HTML. Você encontrará um
método por tag. Para habilitar esses métodos, você deve criar um objeto CGI chamando
CGI.new.
Para facilitar o aninhamento de tags, esses métodos pegam 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>
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 da 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>')
Nós explicamos esses dois conceitos em diferentes seções. Por favor, siga as seções -
Você pode verificar o seguinte tópico na Internet para hospedar seu site em um servidor
baseado em Unix -
O SMTP (Simple Mail Transfer Protocol) é um protocolo que manipula o envio de email e o
roteamento de emails entre servidores de email.
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 .
Um objeto SMTP tem um método de instância chamado sendmail, que normalmente será
usado para fazer o trabalho de enviar uma mensagem. Leva três parâmetros -
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
Aqui, você colocou um e-mail básico em uma mensagem, usando um documento, tomando
o cuidado de formatar os cabeçalhos corretamente. Os e-mails exigem um cabeçalho De ,
Para e Assunto , separados do corpo do e-mail com uma linha em branco.
Para enviar o e-mail, use Net :: SMTP para se conectar 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 (mesmo que 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á detalhes do servidor de e-mail de saída que você pode fornecer para o Net ::
SMTP, como segue:
Net::SMTP.start('mail.your-domain.com')
Net::SMTP.start('mail.your-domain.com',
25,
'localhost',
'username', 'password' :plain)
Quando você envia uma mensagem de texto usando Ruby, todo o conteúdo será tratado
como texto simples. Mesmo se você incluir tags HTML em uma mensagem de texto, ela será
exibida como texto simples e as tags HTML não serão formatadas de acordo com a sintaxe
HTML. Mas Ruby Net :: SMTP fornece opção para enviar uma mensagem HTML como
mensagem HTML real.
Ao enviar uma mensagem de e-mail, você pode especificar uma versão do Mime, um tipo de
conteúdo e um conjunto de caracteres para enviar um e-mail em HTML.
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
Para enviar um email com conteúdo misto, é necessário definir o cabeçalho do tipo de
conteúdo para multipart / mixed . Em seguida, as seções de texto e anexo podem ser
especificadas dentro dos limites .
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.
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
#{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 fornece dois níveis de acesso aos serviços de rede. Em um nível baixo, você pode
acessar o suporte a soquete básico no sistema operacional subjacente, o que permite
implementar clientes e servidores para protocolos orientados a conexão e sem conexão.
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.
Sockets podem ser implementados em vários tipos de canais diferentes: sockets de domínio
Unix, TCP, UDP e assim por diante. O soquete fornece classes específicas para manipular os
transportes comuns, bem como uma interface genérica para manipular o restante.
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.
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 esse soquete.
O TCPSocket.open (hosname, port) abre uma conexão TCP para o hostname na porta .
Depois de ter um soquete aberto, você pode ler como qualquer objeto IO. Quando terminar,
lembre-se de fechá-lo, pois você fecharia um arquivo.
hostname = 'localhost'
port = 2000
s = TCPSocket.open(hostname, port)
Agora, chame TCPServer.open (hostname, port function para especificar uma porta para
seu serviço e criar um objeto TCPServer .
Em seguida, chamar a aceitar método do objeto TCPServer retornado. Esse método aguarda
até que um cliente se conecte à porta especificada e, em seguida, retorna um objeto
TCPSocket que representa a conexão com esse cliente.
Agora, execute este servidor em segundo plano e, em seguida, execute o cliente acima para
ver o resultado.
A maioria dos servidores na Internet é projetada para lidar com um grande número de
clientes a qualquer momento.
Neste exemplo, você tem um loop permanente e, quando server.accept responde, um novo
thread é criado e iniciado imediatamente para manipular a conexão que acaba de ser aceita,
usando o objeto de conexão passado para o thread. No entanto, o programa principal
retorna imediatamente e aguarda novas conexões.
Usar Ruby Thread dessa forma significa que o código é portátil e será executado da mesma
maneira no Linux, OS X e Windows.
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 ao código
anterior -
Por favor, verifique bibliotecas semelhantes para trabalhar com protocolos FTP, SMTP, POP e
IMAP.
Nós demos-lhe um início rápido na programação do soquete. É um assunto grande, por isso
é recomendado que você vá através da Ruby Socket Library e Class Methods para
encontrar mais detalhes.
A XML (Extensible Markup Language) é uma linguagem de marcação muitoO que é XML?
semelhante a HTML ou SGML. Isso é recomendado pelo World Wide Web
Consortium e disponível como padrão aberto.
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 XML é extremamente útil para rastrear quantidades pequenas a médias de dados sem
exigir um backbone baseado em SQL.
Existem dois sabores diferentes disponíveis para analisadores XML -
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á motivo para que você não
possa usá-las para grandes projetos.
A maneira mais comum de manipular XML é com a biblioteca REXML por Sean Russell.
Desde 2002, o REXML faz parte da distribuição padrão do Ruby.
Para todos os nossos exemplos de código XML, vamos usar um arquivo XML simples como
uma entrada -
Vamos primeiro analisar nossos dados XML em forma de árvore . Começamos exigindo a
biblioteca rexml / document ; muitas vezes fazemos um include REXML para importar
para o namespace de nível superior por conveniência.
#!/usr/bin/ruby -w
require 'rexml/document'
include REXML
xmlfile = File.new("movies.xml")
xmldoc = Document.new(xmlfile)
Para processar os mesmos dados, filmes.xml , arquivo de uma maneira orientada a fluxo ,
definiremos uma classe de ouvinte cujos métodos serão o destino dos retornos de chamada
do analisador.
OBSERVAÇÃO : não é recomendável usar a análise parecida com o SAX para um arquivo
pequeno, isso é apenas para um exemplo de demonstração.
#!/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)
O REXML tem suporte a XPath por meio da classe XPath . Ele pressupõe 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)
Existem dois analisadores XSLT disponíveis que o Ruby pode usar. Uma breve descrição de
cada um é dada aqui.
Este analisador é escrito e mantido por Masayoshi Takahashi. Isso é escrito principalmente
para o Linux OS e requer as seguintes bibliotecas -
Sablot
Iconv
Expat
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).
XSLT4R possui a seguinte sintaxe -
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 )
Para obter detalhes completos sobre o REXML Parser, consulte aLeitura Adicional
documentação padrão da documentação do REXML Parser .
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 tutorial simples SOAP para entendê-lo em detalhes.
Este capítulo familiariza você com a implementação do SOAP para Ruby (SOAP4R). Este é
um tutorial básico, portanto, se você precisar de um detalhe profundo, precisará consultar
outros recursos.
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.
Este capítulo fornece detalhes sobre como escrever um servidor autônomo. As etapas a
seguir estão envolvidas na gravação de um servidor SOAP.
Para implementar seu próprio servidor autônomo, você precisa escrever uma nova classe,
que será filha de SOAP :: StandaloneServer da seguinte maneira -
O segundo passo é escrever seus métodos de Serviços da Web, que você gostaria de expor
ao mundo exterior.
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
O próximo passo é adicionar nossos métodos definidos ao nosso servidor. O método initialize
é usado para expor métodos de serviço com um dos dois métodos a seguir -
receptor
methodName
2
O nome do método que é chamado devido a uma solicitação de RPC.
paramArg
Para entender o uso de parâmetros inout ou out , considere o seguinte método de serviço
que usa dois parâmetros (inParam e inoutParam), retorna um valor de retorno normal
(retVal) e dois outros parâmetros: inoutParam e outParam -
add_method(self, 'aMeth', [
%w(in inParam),
%w(inout inoutParam),
%w(out outParam),
%w(retval return)
])
A etapa final é iniciar seu servidor instanciando uma instância da classe derivada e
chamando o método start .
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 fornecer um nome exclusivo de
ServiceName para este servidor.
nome de anfitrião
3
Especifica o nome do host no qual este servidor irá escutar.
porta
4
Um número de porta disponível a ser usado para o serviço da web.
require "soap/rpc/standaloneserver"
begin
class MyServer < SOAP::RPC::StandaloneServer
Agora, você pode executar este servidor em segundo plano da seguinte maneira -
$ ruby MyServer.rb&
A classe SOAP :: RPC :: Driver fornece suporte para gravar aplicativos cliente SOAP. Este
capítulo descreve essa classe e demonstra seu uso com base em um aplicativo.
A seguir está a informação mínima que você precisaria para chamar um serviço SOAP -
Criamos uma instância de SOAP :: RPC :: Driver chamando seu novo método da seguinte
maneira -
namespace
2 O namespace a ser usado para todos os RPCs feitos com esse objeto SOAP :: RPC
:: Driver.
sabãoAção
Para adicionar um método de serviço SOAP a um SOAP :: RPC :: Driver , podemos chamar o
seguinte método usando a instância SOAP :: RPC :: Driver -
driver.add_method(name, *paramArg)
nome
1
O nome do método de serviço da web remoto.
paramArg
2
Especifica os nomes dos parâmetros dos procedimentos remotos.
A etapa final é faturar o serviço SOAP usando a instância SOAP :: RPC :: Driver da seguinte
maneira -
result = driver.serviceMethod(paramArg...)
Aqui serviceMethod é o método de serviço web atual 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)
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 o Web
Services com Ruby .
A interface gráfica de usuário padrão (GUI) para Ruby é Tk. Tk começou como aIntrodução
GUI para a linguagem de script Tcl desenvolvida por John Ousterhout.
Os usuários de Mac e Linux podem não precisar instalá-lo, pois há 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 .
Uma estrutura típica para programas Ruby / Tk é criar a janela principal ou raiz (uma
instância de 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. Por fim, empacotamos o quadro raiz e inserimos o loop de
eventos da GUI principal.
Há uma lista de várias classes Ruby / Tk, que podem ser usadas para criar uma GUI
desejada usando Ruby / Tk.
Ruby / Tk Font, cores e imagens Noções básicas sobre fontes Ruby / Tk, cores e
imagens
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 gerentes de geometria 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 suporta o loop de eventos , que recebe eventos do sistema operacional. Essas são
coisas como pressionamentos de botões, pressionamentos de tecla, movimento do mouse,
redimensionamento de janela e assim por diante.
Ruby / Tk cuida de gerenciar este 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. Os widgets individuais sabem como responder
aos 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 em 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.
Muitos widgets Ruby / Tk podem acionar retornos de chamada quando o usuário os ativa, e
você pode usar o retorno de chamada do comando para especificar que um determinado
bloco de código ou procedimento é invocado quando isso acontece. Como visto
anteriormente, você pode especificar o procedimento de retorno de chamada do comando
ao criar o widget -
helpButton = TkButton.new(buttonFrame) {
text "Help"
command proc { showHelp }
}
Como o método de comando aceita procedimentos ou blocos de código, você também pode
escrever o exemplo de código anterior como -
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 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.
Para simplesmente recuperar o valor de uma opção, configure retorna mais informações do
que geralmente deseja. O método cget retorna apenas o valor atual.
color = button.cget('activebackground')
Ruby / LDAP é uma biblioteca de extensões para Ruby. Ele fornece a interface para algumas
bibliotecas LDAP, como OpenLDAP, UMich LDAP, Netscape SDK e ActiveDirectory.
Ruby 1.8.x (pelo menos 1.8.2 se você quiser usar o ldap / control).
Agora, você pode usar o método padrão de instalaçã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'.
OBSERVAÇÃO : se você estiver criando o software no Windows, talvez seja necessário usar
o nmake em vez do make .
A seguir está a sintaxe para criar uma conexão com um diretório LDAP.
LDAP::Conn.new(host = 'localhost', port = LDAP_PORT)
host - Esse é o ID do host que está executando o diretório LDAP. Nós vamos levá-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 da
porta .
É 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 -
Agora podemos realizar buscas, adicionar, modificar ou excluir operações dentro do bloco do
método bind (entre bind e unbind), desde que tenhamos as permissões apropriadas.
Exemplo
#/usr/bin/ruby -w
require 'ldap'
$HOST = 'localhost'
$PORT = LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT
Precisamos passar o objeto LDAP :: Mod para o método conn.add para criar uma entrada.
Aqui está uma sintaxe simples para criar o objeto LDAP :: Mod -
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.
Quando estivermos prontos com o objeto LDAP :: Mod , podemos chamar o método
conn.add para criar uma entrada. Aqui está uma sintaxe para chamar esse método -
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
Modificar uma entrada é semelhante a adicionar uma. Apenas chame o método modify em
vez de adicionar com os atributos para modificar. Aqui está uma sintaxe simples do método
de modificação .
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.
#/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
Para excluir uma entrada, chame o método delete com o nome distinto como parâmetro.
Aqui está uma sintaxe simples do método delete .
conn.delete(dn)
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
Não é possível modificar o nome distinto de uma entrada com o método de modificação .
Em vez disso, use o método modrdn . Aqui está a sintaxe simples do método modrdn -
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 RDN antigo será excluído da 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
Para realizar uma pesquisa em um diretório LDAP, use o método de pesquisa com um dos
três modos de pesquisa diferentes -
#/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).
Em caso de erro, os métodos new, bind ou unbind levantam uma exceção LDAP ::
Error.
Para obter detalhes completos sobre métodos LDAP, consulte aLeitura Adicional
documentação padrão da documentação do LDAP .
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.
Você pode esperar que um segmento específico termine chamando o método Thread.join
desse segmento . O segmento de chamada irá bloquear até que o segmento determinado
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
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.
A classe de encadeamento apresenta um recurso especial que permite que variáveis locais
de encadeamento sejam criadas e acessadas pelo nome. Você simplesmente trata o objeto
thread como se fosse um hash, escrevendo para elementos usando [] = e lendo-os de volta
usando [].
Neste exemplo, cada thread registra o valor atual da contagem de variáveis em uma
variável threadlocal com a chave mycount .
#!/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
Você pode definir e consultar a prioridade de um objeto Ruby Thread com prioridade = e
prioridade . Um encadeamento recém-criado começa com a mesma prioridade que o
encadeamento que o criou. O thread principal começa na prioridade 0.
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 segmentos 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.
#!/usr/bin/ruby
require 'thread'
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
#!/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
Quando começamos a usar objetos Mutex para exclusão de encadeamentos, devemos ter
cuidado para evitar o deadlock . Deadlock é a condição que ocorre quando todos os threads
estão aguardando para adquirir um recurso mantido por outro thread. Como todos os
encadeamentos estão bloqueados, eles não podem liberar os bloqueios que eles mantêm. E
como eles não podem liberar as travas, nenhum outro thread pode adquirir esses bloqueios.
#!/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
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
Os métodos a seguir são fornecidos pela classe Thread e são aplicáveis a todos os
encadeamentos disponíveis no programa. Esses métodos serão chamados usando o nome
da classe Thread da seguinte maneira -
Thread.abort_on_exception = true
Esses métodos são aplicáveis a uma instância de um segmento. Esses métodos serão
chamados como usando uma instância de um thread da seguinte maneira -
#!/usr/bin/ruby
Como o módulo Kernel está incluído na classe Object , seus métodos estão disponíveis em
todos os lugares no programa Ruby. Eles podem ser chamados sem um receptor (forma
funcional). Portanto, eles são freqüentemente chamados de funções.
Uma lista completa de funções internas é dada aqui para sua referência -
Aqui está uma lista de funções internas relacionadas ao número. Eles devem ser usados da
seguinte maneira -
#!/usr/bin/ruby
num = 12.40
puts num.floor # 12
puts num + 10 # 22.40
puts num.integer? # false as num is a float.
12
22.4
false
Assumindo, n é um número -
Aqui está uma lista de funções internas do Ruby especialmente para números
flutuantes. Supondo que temos um número flutuador f -
A função sprintf (fmt [, arg ...]) e format (fmt [, arg ...]) retorna uma string na qual arg é
formatada de acordo com fmt. As especificações de formatação são essencialmente as
mesmas para sprintf na linguagem de programação C. Os especificadores de conversão (%
seguidos pelo especificador de campo de conversão) em fmt são substituídos pela string
formatada do argumento correspondente.
#!/usr/bin/ruby
abc
d = 42
00ff
hello
he
O teste de função (teste, f1 [, f2]) executa um dos seguintes testes de arquivo especificados
pelo teste de caractere . Para melhorar a legibilidade, você deve usar métodos de classe de
arquivo (por exemplo, File :: readable?) Em vez dessa função.
A seguir, o exemplo de uso. Assumindo que main.rb existe com permissões de leitura,
gravação e não execução -
#!/usr/bin/ruby
true
false
false
Os valores na maioria das variáveis predefinidas podem ser acessados por meios
alternativos.
$!
$@
$/
3 O separador de registro de entrada (nova linha por padrão). Obtém, readline, etc,
tome seu separador de registro de entrada como argumento opcional.
$\
4
O separador de registro de saída (nil por padrão).
$,
5 O separador de saída entre os argumentos para imprimir e Array # join (nil por
padrão). Você pode especificar o separador explicitamente como Array # join.
$;
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
Sinônimo para $ LOAD_PATH.
$ 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
$ LOAD_PATH
$ SAFE
O nível de segurança
$ stdin
20
Entrada padrão (STDIN por padrão).
$ stdout
21
Saída padrão (STDOUT por padrão).
$ stderr
22
Erro padrão (STDERR por padrão).
$ VERBOSE
23
Verdadeiro se a opção da linha de comandos -v, -w ou --verbose for especificada.
$-x
$ -0
25
O valor da opção do interpretador -x e alias de $ /.
A tabela a seguir lista todas as constantes predefinidas do Ruby -
NOTA - VERDADEIRO, FALSO e NIL são compatíveis com versões anteriores. É preferível
usar true, false e nil.
VERDADE
1
Sinônimo de verdadeiro.
FALSO
2
Sinônimo de falso.
NADA
3
Sinônimo para nil.
ARGF
ARGV
DADOS
6 Um fluxo de entrada para ler as linhas de código seguindo a diretiva __END__. Não
definido se __END__ não estiver presente no código.
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 .
STDIN
12
Fluxo de entrada padrão. Valor padrão de $ 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 Rubi -
Para ajudar a lidar com erros, a distribuição padrão do Ruby inclui um depurador.
Isso é muito semelhante ao utilitário gdb , que pode ser usado para depurar
programas complexos.
O irb (Interactive Ruby) foi desenvolvido por Keiju Ishitsuka. Ele permite inserir
comandos no prompt e fazer o interpretador responder como se você estivesse
executando um programa. O irb é útil para experimentar ou explorar o Ruby.
Ruby Profiler -
Existem outras ferramentas úteis que não vêm incluídas na distribuição padrão do Ruby. No
entanto, você precisa instalá-los você mesmo.
Para mais informações sobre ferramentas e recursos Ruby, dê uma olhada nos Recursos
Úteis do Ruby .