# 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. Matsumoto queria desenvolver 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. Ruby está entre as 10 linguagens mais populares, de acordo com uma pesquisa conduzida pela RedMonk desde 2018.
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 JIT e, JRuby e MacRuby também fornecendo compilação AOT. A partir das séries 1.9 em diante Ruby passou a utilizar por padrão a YARV (Yet Another Ruby VirtualMachine) substituindo a Ruby MRI (Matz's Ruby Interpreter).

## 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.
Até a versão 1.9.2-p290, a linguagem era lançada sob a licença dupla Ruby License / GNU General Public License. A partir da versão 1.9.3-p0, passou a ser lançada sob a licença dupla Ruby License / FreeBSD License (também conhecida como 2-clause BSDL). A partir da versão 2.1.0, o projeto passou a utilizar versionamento semântico. Suporte oficial para a versão 1.9.3 foi encerrado em 23 de fevereiro de 2015.

### Etimologia

O nome Ruby foi decidido durante uma sessão de bate-papo online entre Matsumoto 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 clausuras
* 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 da máquina virtual Microsoft .NET (através do 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:
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.

## Exemplos de código
### Strings

Há uma variedade de métodos para definir strings em Ruby. As definições a seguir são equivalentes e suportam interpolação:
O código a seguir define duas strings "cruas" que são equivalentes:

### 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.
Iterando em arrays usando blocos:
Em Ruby, a estrutura de repetição for é apenas açúcar sintático para acessar o método each, existente em iteratores.
Blocos funcionam com muitos métodos padrão; no exemplo a seguir, o uso de blocos com arquivos:
Criando uma função anônima:

### 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.
O código acima irá imprimir:

#### 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:

#### Herança

Ruby não suporta herança múltipla. Ao invés disso, Ruby usa Mixins para emular herança múltipla:
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:

### 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.

### 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 ou Python para os mesmos fins. O script abaixo verifica se serviços Web na porta 80 estão acessíveis.

## Repositórios e bibliotecas

Ruby possui repositórios de bibliotecas disponíveis em sites como Ruby Forge e The Ruby Toolbox; um bastante popular, Ruby Application Archive (RAA), foi descontinuado em agosto de 2013. Existe, ainda, uma ferramenta de instalação de bibliotecas, chamada RubyGems, semelhante aos gerenciadores de pacotes do Linux, como o APT.
Muitos projetos foram movidos para o GitHub, focado em Git, que tinha suporte nativo ao empacotamento do RubyGems. Porém, esse serviço de empacotamento foi descontinuado, em prol de Jeweler e Gemcutter.
O projeto mais famoso desenvolvido em Ruby é o meta-framework Ruby on Rails.