14 de nov. de 2010

Ruby ( linguagem de programação )

Ruby (linguagem de programação)

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa
Ruby
Logotipo do Ruby

Paradigma Multiparadigma
Surgido em 1995
Última versão 1.9.2 (18 de agosto de 2010)
Versão em teste ()
Criado por Yukihiro Matsumoto
Estilo de tipagem: dinâmica, forte
Compiladores
Dialetos: YARV, Ruby MRI, JRuby, Rubinius, IronRuby, MacRuby e HotRuby
Influenciada por Ada, CLU, Dylan, Eiffel, Lisp, Perl, Python, Scheme, Smalltalk
Influenciou Falcon, Fantom, Groovy, Ioke, Nu
Licença: Dupla: Ruby License / GNU General Public License
Página oficial www.ruby-lang.org
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.[1] 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.[2] Atualmente, Ruby é a 10º linguagem de programação mais popular do mundo, de acordo com o Índice Tiobe.[3]
A implementação 1.8.7 padrão é escrita em C, como uma linguagem de programação de único passe.[4] 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,[5] JRuby[6] e MacRuby[7] fornecendo compilação Just-In-Time e, JRuby[6] e MacRuby[7] também fornecendo compilação Ahead-Of-Time. A série 1.9 usa YARV, como também a 2.0 (em desenvolvimento), substituindo a lenta Ruby MRI.[8]

Índice

[esconder]

[editar] História

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.[2] 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.".[1]
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,[9] 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.[1]
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.[10]

[editar] 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.[11] Inicialmente foram propostos dois nomes: "Coral" e "Ruby", sendo esse último nome proposto escolhido mais tarde por Matz em um e-mail para Ishitsuka.[12] 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.[13]

[editar] 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 do Java (através do JRuby) e haver um projeto para ser executável em cima da máquina virtual Microsoft .NET, o IronRuby.

[editar] 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 flutuantes (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/.

[editar] 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

[editar] Exemplos de código

[editar] Programa Olá Mundo

puts "Olá, Mundo!"

[editar] 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 = <<BLOCO
 
Isto é uma string de aspas duplas
BLOCO
O código a seguir define duas strings "cruas" que são equivalentes:
a = 'Isto é uma string de aspas duplas'
a = %q{Isto é uma string de aspas duplas}

[editar] Coleções

[editar] 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)                # [1, 'oi', 3.14, 1, 2, [4, 5], 23]
a << 22                   # [1, 'oi', 3.14, 1, 2, [4, 5], 23, 22]

[editar] Hash

hash = {'água' => 'molhada', 'fogo' => 'quente'}
puts hash['fogo']
 
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'

[editar] 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}

[editar] 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

[editar] 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

[editar] 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).

[editar] 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

[editar] 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 nehuma exceção for lançada
end

[editar] 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

[editar] 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.[14]

Referências

  1. a b c An Interview with the Creator of Ruby (em inglês). Página visitada em 22 de maio de 2010.
  2. a b About Ruby (em inglês). ruby-lang.org. Página visitada em 22 de maio de 2010.
  3. Tiobe Index (em inglês). tiobe.com. Página visitada em 5 de novembro de 2010.
  4. Why Rubinius Matters to Ruby's Future (em inglês). Página visitada em 25 de junho de 2010.
  5. IronRuby Unleashed: An Interview with Shay Friedman (em inglês). Página visitada em 25 de junho de 2010.
  6. a b JRuby Compiler (em inglês). Página visitada em 25 de junho de 2010.
  7. a b The MacRuby Blog (em inglês). Página visitada em 25 de junho de 2010.
  8. Yarv (em inglês). Página visitada em 25 de junho de 2010.
  9. Mailing Lists (em inglês). ruby-lang.org. Página visitada em 6 de julho de 2010.
  10. Web Development: Ruby on Rails (em inglês). Página visitada em 3 de junho de 2010.
  11. History of Ruby (em inglês). Página visitada em 22 de maio de 2010.
  12. "The decisive moment of the language name Ruby" - Email from Hiroshi Sugihara to ruby-talk (em inglês). Página visitada em 22 de maio de 2010.
  13. "Re: the name of Ruby?" - Email from Yukihiro Matsumoto to ruby-talk (em inglês). Página visitada em 22 de maio de 2010.
  14. Gem Building is Defunct (em inglês). Página visitada em 15 de julho de 2010.

[editar] Ver também

[editar] Ligações externas

[Esconder]

Nenhum comentário:

Postar um comentário