skip to main | skip to sidebar
Loading

sexta-feira, 12 de agosto de 2011

Ruby (linguagem de programação)


Ruby é uma linguagem de programação interpretada multiparadigma, de tipagem dinâmica e forte, com gerenciamento de memória automático, originalmente planejada e desenvolvida no Japão em 1995, por Yukihiro "Matz" Matsumoto, para ser usada como linguagem de script. Matz queria uma linguagem de script que fosse mais poderosa do que Perl, e mais orientada a objetos do que Python. Ruby suporta programação funcional, orientada a objetos, imperativa e reflexiva. Foi inspirada principalmente por Python, Perl, Smalltalk, Eiffel, Ada e Lisp, sendo muito similar em vários aspectos a Python. Atualmente, Ruby é a 12º linguagem de programação mais popular do mundo, de acordo com o Índice Tiobe.
A implementação 1.8.7 padrão é escrita em C, como uma linguagem de programação de único passe. Não há qualquer especificação da linguagem, assim a implementação original é considerada de fato uma referência. Atualmente, há várias implementações alternativas da linguagem, incluindo YARV, JRuby, Rubinius, IronRuby, MacRuby e HotRuby, cada qual com uma abordagem diferente, com IronRuby, JRuby  e MacRuby  fornecendo compilação Just-In-Time e, JRuby e MacRuby também fornecendo compilação Ahead-Of-Time. A série 1.9 usa YARV (Yet Another Ruby VirtualMachine), como também a 2.0 (em desenvolvimento), substituindo a lenta Ruby MRI (Matz's Ruby Interpreter).

Yukihiro Matsumoto, criador da linguagem Ruby
História

A linguagem Ruby foi concebida em 24 de fevereiro de 1993 por Yukihiro Matsumoto, que pretendia criar uma nova linguagem que balanceava programação funcional com a programação imperativa. Matsumoto afirmou: "Eu queria uma linguagem de script que fosse mais poderosa do que Perl, e mais orientada a objetos do que Python. É por isso que eu decidi desenvolver minha própria linguagem.".
Após o lançamento do Ruby 1.3 em 1999, iniciou-se a primeira lista de discussão em inglês chamada Ruby-Talk, marcando um interesse crescente na linguagem fora do Japão. Em setembro de 2000, o primeiro livro em inglês, Programming Ruby, foi impresso, sendo mais tarde liberado gratuitamente para o público, ajudando no processo de adoção de Ruby por falantes do inglês.
Por volta de 2005, o interesse pela linguagem Ruby subiu em conjunto com o Ruby on Rails, um framework de aplicações web popular escrito em Ruby. Rails é frequentemente creditada como a aplicação que tornou Ruby "famosa" e a associação é tão forte que ambos são muitas vezes confundidos por programadores que são novos a Ruby.

Etimologia do nome "Ruby"

 

O nome "Ruby", foi decidido durante uma sessão de bate-papo online entre Matsumoto (Matz) e Keiju Ishitsuka em 24 de fevereiro de 1993, antes que qualquer linha de código tivesse sido escrita para a linguagem.Inicialmente foram propostos dois nomes: "Coral" e "Ruby", sendo esse último nome proposto escolhido mais tarde por Matz em um e-mail para Ishitsuka. Matsumoto explicou mais tarde que o motivo de ter escolhido o nome "Ruby" foi porque essa era a pedra zodiacal de um de seus colegas. 

Características
Uma série de características foram definidas para atender às propostas do Ruby:
  • Todas as variáveis são objetos, onde até os "tipos primitivos" (tais como inteiro, real, entre outros) são classes
  • Métodos de geração de código em tempo real, como os "attribute accessors"
  • Através do RubyGems, é possível instalar e atualizar bibliotecas com uma linha de comando, de maneira similar ao APT do Debian Linux
  • Code blocks (blocos de código) passados como parâmetros para métodos; permite a criação de closures
  • Mixins, uma forma de emular a herança múltipla
  • Tipagem dinâmica, mas forte. Isso significa que todas as variáveis devem ter um tipo (fazer parte de uma classe), mas a classe pode ser alterada dinamicamente
Ruby está disponível para diversas plataformas, como Microsoft Windows, Linux, Solaris e Mac OS X, além de também ser executável em cima da máquina virtual Java (através do JRuby) e haver um projeto para ser executável em cima da máquina virtual Microsoft .NET, o IronRuby.

Tipos de dados

 

Não existem "tipos primitivos" em Ruby; todos os tipos são classes:
  • Object é a classe mãe de todas as outras classes em Ruby
    • Numeric é uma classe abstrata que representa números
      • Integer é uma classe que representa números inteiros
        • Fixnum representa números inteiros de precisão fixa
        • Bignum representa números inteiros de precisão infinita, dependente apenas da memória disponível
      • Float é uma classe que representa números de ponto flutuante (números reais)
    • String uma cadeia de caracteres. Pode ser delimitado por apóstrofes (') ou aspas ("). Tudo o que há entre apóstrofes é interpretado literalmente, entre aspas o programador deve se utilizar de símbolos para representar caracteres específicos, como em C. Exemplos: 'azul', "a\nb\nc"
    • Symbol é semelhante a uma string, mas dois símbolos iguais possuem o mesmo endereço de memória, sendo assim é ótimo para se utilizar como índice numa Hash. Porém, devido à sua natureza, o coletor de lixo do Ruby não os elimina. É definido com um sinal de dois pontos (:), por exemplo, :nome
    • Array são arrays dinâmicos, que podem ser usados para representar matrizes e vetores. É delimitado por colchetes ([]) e cada valor é separado por vírgula. Exemplo: [4, 'azul', :termometro]
    • Hash representa um vetor associativo, e, assim como as Arrays, é dinâmica. É delimitada por chaves ({}), e o índice precede o valor com um sinal '=>'. Exemplo: {:controller => 'user', :action => 'index'}. Qualquer objeto pode ser um índice, mas os mais usados são as Strings e os Symbols
    • Regexp representa expressões regulares, delimitadas por //. Funciona de forma semelhante a Perl. Exemplo: /a|ae/

 

Declaração de variáveis

 

Um objeto em Ruby é declarado com uma atribuição comum:

var1 = 2
var2 = Classe.new
var3 = Classe2.new(parametro) 
 

Uma variável local é declarada normalmente. Uma variável de instância é declarada com um "@" no nome. Uma variável de classe é declarada com "@@", e uma variável global é declarada com "$". Variáveis que iniciam com uma letra maiúscula são consideradas constantes.

local = "local"
@instancia = 42
@@classe = /f+/
$Pi = 3.1415926 

Exemplos de código

 

Programa Olá Mundo

puts "Olá, Mundo!"
 

Strings

 

Há uma variedade de métodos para definir strings em Ruby. As definições a seguir são equivalentes e suportam interpolação:


a = "\nIsto é uma string de aspas duplas\n"
a = %Q{\nIsto é uma string de aspas duplas\n}
a = %{\nIsto é uma string de aspas duplas\n}
a = %/\nIsto é uma string de aspas duplas\n/
a = < 
 
 
O código a seguir define duas strings "cruas" que são equivalentes:


a = 'Isto é uma string de aspas simples'
a = %q{Isto é uma string de aspas simples} 
 

Coleções

 

Array

 

a = [1, 'oi', 3.14, 1, 2, [4, 5]]
 
a[2]                      # => 3.14
a.reverse                 # => [[4, 5], 2, 1, 3.14, 'oi', 1]
a.flatten.uniq            # => [1, 'oi', 3.14, 2, 4, 5]
a.push(23)                # a = [1, 'oi', 3.14, 1, 2, [4, 5], 23]
a << 22                   # a = [1, 'oi', 3.14, 1, 2, [4, 5], 23, 22] 
 

Hash

 

 

hash = {'água' => 'molhada', 'fogo' => 'quente'}
puts hash['fogo'] # "quente"
 
hash.each_pair do |chave, valor|
  puts "#{chave} é #{valor}"
end
 
# Imprime:
 
# água é molhada
# fogo é quente
 
hash.delete_if {|chave, valor| chave == 'água'} # Apaga 'água' => 'molhada' 
 

Blocos e iteradores

Blocos de código (ou code blocks) são trechos de código que são passados como parâmetros para métodos. Blocos são extremamente usados em Ruby.
class Paises
  @paises = ["Argentina", "Brasil", "Paraguai", "Uruguai"]
 
  def self.each
    for pais in @paises
      yield pais
    end
  end
end
 
Paises.each do |pais|
  puts "Olá, #{pais}!"
end 
 
 

Iterando em arrays usando blocos:

array = [1, 'oi', 3.14]
 
array.each do |item|
  puts item
end
# => 1
# => 'oi'
# => 3.14
 
# Equivalente, usando chaves:
array.each { |item|
  puts item
}
# => 1
# => 'oi'
# => 3.14 
 

Em Ruby, a estrutura de repetição for é apenas açúcar sintático para acessar o método each, existente em iteratores.

array = [1, 'oi', 3.14]
 
for item in array
  puts item
end
 
# => 1
# => 'oi'
# => 3.14 
 
 

Blocos funcionam com muitos métodos padrão; no exemplo a seguir, o uso de blocos com arquivos:

File.open('arquivo.txt', 'w') do |arquivo|
  for i in (1..3) do
    arquivo.puts 'Olá, Mundo!'
  end
end                                  # O arquivo é fechado automaticamente aqui
 
File.readlines('arquivo.txt').each do |linha|
  puts linha
end
 
# => Olá, Mundo!
# => Olá, Mundo!
# => Olá, Mundo! 
 
Criando uma função anônima:

proc {|arg| print arg}
Proc.new {|arg| print arg}
lambda {|arg| print arg} 

Classes

 

O código a seguir define uma classe chamada Pessoa. Além de initialize, o construtor para criar novos objetos, essa classe tem dois métodos: um que sobre-escreve o operador de comparação > (maior), e sobre-escreve o método to_s (assim o comando puts pode formatar a saída). Aqui attr_reader é um exemplo de metaprogramação em Ruby: attr_reader define o método getter, attr_writer define o método setter, e attr_accessor define ambos. Em Ruby, todos os atributos são privados e todos os métodos públicos, por padrão. Ruby permite definir opcionalmente o tipo de acesso usando três palavras-chave: public (público), private (privado) e protected (protegido). Ruby não suporta sobrecarga de métodos, mas suporta argumentos padrão, que podem ser utilizados para o mesmo fim. Também, o último comando em um método é considerado o seu valor de retorno, permitindo a omissão de um explícito return.
 
class Pessoa
  attr_reader :nome, :idade
 
  def initialize(nome = "Desconhecido", idade)
    @nome, @idade = nome, idade
  end
 
  def >(pessoa)
    if self.idade > pessoa.idade
      return true
    else
      return false
    end
  end
 
  def to_s # Método usado pelo método puts() para formatar a saída
    "#@nome (#@idade anos)"
  end
end
 
pessoas = [
            Pessoa.new("Ricardo", 19),
            Pessoa.new(idade = 25)
          ]
 
puts pessoas[0]
puts pessoas[1]
puts pessoas[0] > pessoas[1] # O mesmo que: pessoas[0].>(pessoas[1])
O código acima irá imprimir:
Ricardo (19 anos)
Desconhecido (25 anos)
false

Classes abertas

Em Ruby, as classes nunca são fechadas: você pode sempre adicionar novos métodos a uma classe. Isso se aplica tanto para classes criadas por você, quanto para as classes padrão. Um exemplo simples de adição de um novo método a classe padrão String:

class String
  def iniciais
    ini = String.new
 
    for nome in self.split do
      ini += nome[0]
    end
 
    return ini
  end
end
 
puts "Ricardo Silva Veloso".iniciais # Imprime RSV

Herança

Ruby não suporta herança múltipla. Ao invés disso, Ruby usa Mixins para emular herança múltipla:

class Pessoa < Mamifero # Herança de Mamifero
  include Humano # Emulando herança múltipla
end 
 

No exemplo acima, "Humano" é um módulo (module).

Modules

Além das classes normais, Ruby possui os "Modules", que são classes de classes, permitindo espaço de nomes:

module Humano
  class Classe1
    def info
      "#{self.class} (\##{self.object_id}): #{self.to_s}"
    end
  end
end

Tratamento de exceções

Como a maioria das linguagens modernas, Ruby também possui suporte para tratamento de exceção. As palavras-chave para isto são "begin", "rescue" e "ensure". "Begin" inicia um trecho que pode cair em alguma exceção (opcional), "Rescue" determina o comportamento em caso de uma exceção específica ou não e, "Ensure" é o código que será executado independente de ter havido exceção ou não.

begin
# Faça algo
rescue
# Trata alguma exceção
else
# Faça isto se nehuma exceção for lançada
ensure
# Faça isto se alguma ou nenhuma exceção for lançada
end

Ruby para administradores de sistemas

A maioria dos administradores de sistemas Unix utilizam Perl ou Shell Script como ferramenta para resolver os problemas. Mas é possível usar Ruby e Python para os mesmos fins. Abaixo, a idéia é fazer um pequeno script que verifica se o serviço da porta 80 (Web) de alguns servidores estavam ativos.

require 'net/http'
 
File.open("hosts.txt", "r").each_line do | host |
 
  conexao = Net::HTTP.new(host.chomp, 80)
  resposta, conteudo = conexao.get("/", nil)
 
  if resposta.code.to_i > 400
  # aqui vai a rotina pra enviar email...
  end
end

Repositórios e bibliotecas

Ruby possui repositórios de bibliotecas disponíveis em sites como Ruby Forge e Ruby Application Archive (RAA). Existe, ainda, uma ferramenta de instalação de bibliotecas, chamada RubyGems, semelhante aos gerenciadores de pacotes do Linux, como o APT. O projeto mais famoso desenvolvido em Ruby é o meta-framework Ruby on Rails.
Recentemente, muitas bibliotecas novas e existentes foram hospedadas no GitHub, que é focado em Git e tinha suporte nativo ao empacotamento do RubyGems.

0 comentários:

Postar um comentário

2leep.com