Quando olha pela primeira vez para um pedaço de código Ruby,
lembrar-se-á, muito provavelmente, de outras linguagens de programação
que já utilizou. Isto é de propósito. Muita da sintaxe é familiar a
utilizadores de Perl, Python e Java (entre outras linguagens). Assim
sendo, se já usou alguma delas, aprender Ruby será muito fácil.
{: .summary}

Este documento contém duas secções principais. A primeira, tenta ser um
sumário introdutório daquilo que poderá esperar enquanto muda de uma
linguagem *X* para Ruby. A segunda secção encarrega-se das
características principais da linguagem e como elas se comparam com
aquilo que já se encontra familiarizado.

## O Que Esperar: *Linguagem X* para Ruby

* [Para Ruby a partir de C e C++](to-ruby-from-c-and-cpp/)
* [Para Ruby a partir de Java](to-ruby-from-java/)
* [Para Ruby a partir de Perl](to-ruby-from-perl/)
* [Para Ruby a partir de PHP](to-ruby-from-php/)
* [Para Ruby a partir de Python](to-ruby-from-python/)

## Características Importantes da Linguagem e Algumas Notas

Aqui ficam alguns apontamentos e dicas das principais características
que irá encontrar enquanto vai aprendendo Ruby.

### Iterações

Duas características do Ruby são um pouco diferentes daquilo que já
alguma vez viu, e é necessário algum tempo para se habituar a elas:
“blocos” e iteradores. Em vez de fazer um ciclo sobre um índice (como no
C, C++, ou Java pre-1.5), ou sobre uma lista (como o `for (@a) {...}`
do Perl ou `for i in Lista: ...` do Python, em Ruby irá frequentemente ver

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">alguma_lista</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">este_item</span><span class="o">|</span>
  <span class="c1"># Estamos dentro do bloco.</span>
  <span class="c1"># tratamos este_item.</span>
<span class="k">end</span></code></pre></figure>

Para mais informação sobre o mé `each` (e `collect`, `find`, `inject`,
`sort`, etc.), Ver `ri Enumerable`
(e depois `ri Enumerable#nome_da_função`).

### Tudo tem um valor

Não existe diferença entre uma expressão e uma declaração. Tudo tem um
valor, mesmo que seja **nil**. Isto é possível:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">x</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">y</span> <span class="o">=</span> <span class="mi">11</span>
<span class="n">z</span> <span class="o">=</span> <span class="k">if</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">y</span>
      <span class="kp">true</span>
    <span class="k">else</span>
      <span class="kp">false</span>
    <span class="k">end</span>
<span class="n">z</span> <span class="c1"># =&gt; true</span></code></pre></figure>

### Símbolos não são Strings

Muitos principiantes de Ruby lutam por perceber o que são símbolos e
para quê que podem ser utilizados.

Símbolos podem ser descritos como identidades. Um símbolo é tudo sobre
**quem** é, não sobre **o que** é. Arranque o `irb` e veja a diferença:

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):001:0&gt;</span><span class="w"> </span><span class="ss">:jorge</span><span class="p">.</span><span class="nf">object_id</span> <span class="o">==</span> <span class="ss">:jorge</span><span class="p">.</span><span class="nf">object_id</span>
<span class="p">=&gt;</span> <span class="kp">true</span>
<span class="gp">irb(main):002:0&gt;</span><span class="w"> </span><span class="s2">"jorge"</span><span class="p">.</span><span class="nf">object_id</span> <span class="o">==</span> <span class="s2">"jorge"</span><span class="p">.</span><span class="nf">object_id</span>
<span class="p">=&gt;</span> <span class="kp">false</span>
<span class="gp">irb(main):003:0&gt;</span></code></pre></figure>

Os métodos *`object_id`* retornam a identidade de um Objecto. Se dois
objectos têm o mesmo *`object_id`*, então são o mesmo (apontam para o
mesmo objecto em memória).

Como pode verificar quando utilizou pela primeira vez um símbolo,
qualquer símbolo com os mesmos caracteres referencia o mesmo objecto em
memória. Para quaisquer dois símbolos que representem os mesmos
caracteres os *`object_id`* são os mesmos.

Agora atente na *String*(“jorge”). Os *`object_id`* não são os mesmos.
Isto significa que referenciam dois objectos diferentes em memória.
Sempre que se utiliza uma nova String, o Ruby faz alocação de memória
para esta.

Se tiver dúvidas na utilização entre um símbolo e uma *String*,
considere o que é mais importante: a identidade de um objecto (p.e.
chave da tabela de Hashing), ou os conteúdos (no exemplo acima,
“jorge”).

### Tudo é um objecto

“Tudo é um Objecto” não é só uma hipérbole. Mesmo as classes e os
inteiros são objectos e poderá fazer o mesmo com eles o mesmo que faz
com qualquer outro objecto:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># Isto e' o mesmo que</span>
<span class="c1"># class AMinhaClasse</span>
<span class="c1">#   attr_accessor :variavel_de_instancia</span>
<span class="c1"># end</span>
<span class="no">AMinhaClasse</span> <span class="o">=</span> <span class="no">Class</span><span class="p">.</span><span class="nf">new</span> <span class="k">do</span>
  <span class="nb">attr_accessor</span> <span class="ss">:variavel_de_instancia</span>
<span class="k">end</span></code></pre></figure>

### Constantes Variáveis

As constantes não são verdadadeiramente constantes. Se modificar uma
constante já inicializada, activar-se-á um aviso, mas o seu programa não
terminará. No entanto, isto não quer dizer, que **deverá** redefinir
constantes.

### Convenções na Nomenclatura

O Ruby obriga a algumas convenções na nomenclatura. Se um identificador
começar com:

* Letra Maiúscula, é uma *constante*;
* `$`, é uma variável global;
* `@`, é uma variável de instância;
* `@@` é uma variável de classe.

Apesar de tudo os nomes dos métodos permite-se que comecem com letras
maiúsculas Isto poderá tornar-se confuso, como se pode ver o exemplo
seguinte mostra:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="no">Constante</span> <span class="o">=</span> <span class="mi">10</span>
<span class="k">def</span> <span class="nf">Constante</span>
  <span class="mi">11</span>
<span class="k">end</span></code></pre></figure>

Agora `Constante` é 10, mas `Constante()` é 11.

### Argumentos nomeados

Como em Python, desde a versão Ruby 2.0, métodos podem ser definidos
usando argumentos nomeados. Exemplo:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">deliver</span><span class="p">(</span><span class="ss">from: </span><span class="s2">"A"</span><span class="p">,</span> <span class="ss">to: </span><span class="kp">nil</span><span class="p">,</span> <span class="ss">via: </span><span class="s2">"mail"</span><span class="p">)</span>
  <span class="s2">"Enviando de </span><span class="si">#{</span><span class="n">from</span><span class="si">}</span><span class="s2"> para </span><span class="si">#{</span><span class="n">to</span><span class="si">}</span><span class="s2"> através de </span><span class="si">#{</span><span class="n">via</span><span class="si">}</span><span class="s2">."</span>
<span class="k">end</span>

<span class="n">deliver</span><span class="p">(</span><span class="ss">to: </span><span class="s2">"B"</span><span class="p">)</span>
<span class="c1"># =&gt; "Enviando de A para B atavés de mail."</span>
<span class="n">deliver</span><span class="p">(</span><span class="ss">via: </span><span class="s2">"Pony Express"</span><span class="p">,</span> <span class="ss">from: </span><span class="s2">"B"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"A"</span><span class="p">)</span>
<span class="c1"># =&gt; "Enviando de B para A através de Pony Express."</span></code></pre></figure>

### A Propriedade Universal

Tudo em Ruby, excepto **nil** e **false**, é considerado verdadeiro. Em
C, Python e em muitas outras linguagens, 0 and possivelmente outros
valores, tais como listas vazias, são consideradas falsas. Veja o
seguinte código Python (o exemplo aplica-se a outras linguagens também):

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="c1"># em Python
</span><span class="k">if</span> <span class="mi">0</span><span class="p">:</span>
  <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">0 e</span><span class="sh">'</span><span class="s"> verdadeiro</span><span class="sh">"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
  <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">0 e</span><span class="sh">'</span><span class="s"> falso</span><span class="sh">"</span><span class="p">)</span></code></pre></figure>

Isto irá imprimir “0 e’ falso”. O equivalente em Ruby:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># em Ruby</span>
<span class="k">if</span> <span class="mi">0</span>
  <span class="nb">puts</span> <span class="s2">"0 e' verdadeiro"</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"0 e' falso"</span>
<span class="k">end</span></code></pre></figure>

imprime “0 e’ verdadeiro”.

###  *Access modifiers* aplicam-se até ao fim do âmbito

No seguinte código Ruby,

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">AMinhaClasse</span>
  <span class="kp">private</span>
  <span class="k">def</span> <span class="nf">um_metodo</span><span class="p">;</span> <span class="kp">true</span><span class="p">;</span> <span class="k">end</span>
  <span class="k">def</span> <span class="nf">outro_metodo</span><span class="p">;</span> <span class="kp">false</span><span class="p">;</span> <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

Poderá pensar que `outro_metodo` seja público. Não é verdade. O
`private` access modifier continua até ao fim do escopo, ou até que
outro access modifier apareça, qualquer que apareça primeiro.

Por omissão, os métodos são públicos:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">MyClass</span>
  <span class="c1"># Agora um_metodo é público</span>
  <span class="k">def</span> <span class="nf">um_metodo</span><span class="p">;</span> <span class="kp">true</span><span class="p">;</span> <span class="k">end</span>

  <span class="kp">private</span>

  <span class="c1"># another_method is private</span>
  <span class="k">def</span> <span class="nf">outro_metodo</span><span class="p">;</span> <span class="kp">false</span><span class="p">;</span> <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

`public`, `private` e `protected` são, na verdade, métodos, por isso podem levar parâmetros. Se passar um Symbol a um deles, a visibilidade desse método é alterada.

### Acesso a métodos

Em Java, `public` significa que um método é acessível por todos;
`protected` significa que instâncias da classe, instâncias de classes
descendentes e instâncias das classes no mesmo *package* podem aceder,
mas mais nada pode; `private` significa que nada, para além das
instâncias da classe podem aceder ao método.

Em Ruby existem diferenças: `public` é, claro, público; `private`
significa que os métodos são acessíveis somente quando chamados com um
receptor específico. Só **self** pode ser o receptor dum método privado
Only **self** is allowed to be the receiver of a private method call.

`protected` é aquele que se deve ter mais cuidado. Um método protegido pode ser chamado de uma class ou classes descendentes, mas também com outra instância como receptor. Exemplo adaptado da [Ruby Language FAQ][faq]:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Test</span>
  <span class="c1"># public por omissao</span>
  <span class="k">def</span> <span class="nf">identifier</span>
    <span class="mi">99</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">==</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
    <span class="n">identifier</span> <span class="o">==</span> <span class="n">other</span><span class="p">.</span><span class="nf">identifier</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="n">t1</span> <span class="o">=</span> <span class="no">Test</span><span class="p">.</span><span class="nf">new</span>  <span class="c1"># =&gt; #&lt;Test:0x34ab50&gt;</span>
<span class="n">t2</span> <span class="o">=</span> <span class="no">Test</span><span class="p">.</span><span class="nf">new</span>  <span class="c1"># =&gt; #&lt;Test:0x342784&gt;</span>
<span class="n">t1</span> <span class="o">==</span> <span class="n">t2</span>       <span class="c1"># =&gt; true</span>

<span class="c1"># seja `identifier' protected. ainda funciona</span>
<span class="c1"># porque protected permite a outra referência</span>

<span class="k">class</span> <span class="nc">Test</span>
  <span class="kp">protected</span> <span class="ss">:identifier</span>
<span class="k">end</span>

<span class="n">t1</span> <span class="o">==</span> <span class="n">t2</span>  <span class="c1"># =&gt; true</span>

<span class="c1"># seja `identifier' private</span>

<span class="k">class</span> <span class="nc">Test</span>
  <span class="kp">private</span> <span class="ss">:identifier</span>
<span class="k">end</span>

<span class="n">t1</span> <span class="o">==</span> <span class="n">t2</span>
<span class="c1"># NoMethodError: private method `identifier' called for #&lt;Test:0x342784&gt;</span></code></pre></figure>

### As Classes são abertas

As classes em Ruby são abertas. Poderá abrir, adicionar e alterá-las a
qualquer altura. Mesmo as classes do núcleo como por exemplo `Integer` ou
mesmo a classe `Object`, a classe de topo. O Ruby on Rails define uma
quantidade de métodos para lidar com as horas na classe `Integer`. Veja:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Integer</span>
  <span class="k">def</span> <span class="nf">horas</span>
    <span class="nb">self</span> <span class="o">*</span> <span class="mi">3600</span> <span class="c1"># nu'mero de segundos numa hora</span>
  <span class="k">end</span>
  <span class="k">alias</span> <span class="n">hora</span> <span class="n">horas</span>
<span class="k">end</span>

<span class="c1"># 14 horas depois da meia noite de 1 de Janeiro</span>
<span class="c1"># (também as horas a que costuma acordar nesse dia ;) )</span>
<span class="no">Time</span><span class="p">.</span><span class="nf">mktime</span><span class="p">(</span><span class="mi">2006</span><span class="p">,</span> <span class="mo">01</span><span class="p">,</span> <span class="mo">01</span><span class="p">)</span> <span class="o">+</span> <span class="mi">14</span><span class="p">.</span><span class="nf">horas</span> <span class="c1"># =&gt; Sun Jan 01 14:00:00</span></code></pre></figure>

### Nomes engraçados para métodos

Em Ruby, os métodos podem terminar com pontos de interrogação e de
exclamação. Por convenção, métodos que respondem a questões (p.e.
`Array#empty?` devolve **true** se o receptor é vazio) terminam
em ponto de interrogação. Métodos potencialmente “perigosos” (ie métodos
que modificam **self** ou os argumentos, `exit!`, etc.) por convenção
terminam em ponto de exclamação.

No entanto, todos os métodos que alteram os seus argumentos não terminam
com pontos de exclamação. `Array#replace` substitui os conteúdos
de um array com os de um outro array. Não faz muito sentido ter um
método como este que **não** modifique self.

### Singleton methods

Singleton Methods são métodos que só se encontram disponíveis no objecto
em que foi definido.

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Car</span>
  <span class="k">def</span> <span class="nf">inspect</span>
    <span class="s2">"Carro barato"</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="n">porsche</span> <span class="o">=</span> <span class="no">Car</span><span class="p">.</span><span class="nf">new</span>
<span class="n">porsche</span><span class="p">.</span><span class="nf">inspect</span> <span class="c1"># =&gt; Carro barato</span>
<span class="k">def</span> <span class="nc">porsche</span><span class="o">.</span><span class="nf">inspect</span>
  <span class="s2">"Carro caro"</span>
<span class="k">end</span>

<span class="n">porsche</span><span class="p">.</span><span class="nf">inspect</span> <span class="c1"># =&gt; Carro caro</span>

<span class="c1"># Os outros objectos não são afectados</span>
<span class="n">other_car</span> <span class="o">=</span> <span class="no">Car</span><span class="p">.</span><span class="nf">new</span>
<span class="n">other_car</span><span class="p">.</span><span class="nf">inspect</span> <span class="c1"># =&gt; Carro barato</span></code></pre></figure>

### Missing methods

Ruby doesn’t give up if it can’t find a method that responds to a
particular message. It calls the `method_missing` method with the name
of the method it couldn’t find and the arguments. By default,
`method_missing` raises a NameError exception, but you can redefine it to
better fit your application, and many libraries do. Here is an example:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># id is the name of the method called, the * syntax collects</span>
<span class="c1"># all the arguments in an array named 'arguments'</span>
<span class="k">def</span> <span class="nf">method_missing</span><span class="p">(</span><span class="nb">id</span><span class="p">,</span> <span class="o">*</span><span class="n">arguments</span><span class="p">)</span>
  <span class="nb">puts</span> <span class="s2">"Method </span><span class="si">#{</span><span class="nb">id</span><span class="si">}</span><span class="s2"> was called, but not found. It has "</span> <span class="o">+</span>
       <span class="s2">"these arguments: </span><span class="si">#{</span><span class="n">arguments</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="s2">", "</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>

<span class="n">__</span> <span class="ss">:a</span><span class="p">,</span> <span class="ss">:b</span><span class="p">,</span> <span class="mi">10</span>
<span class="c1"># =&gt; Method __ was called, but not found. It has these</span>
<span class="c1"># arguments: a, b, 10</span></code></pre></figure>

The code above just prints the details of the call, but you are free to
handle the message in any way that is appropriate.

### Troca de mensagens. Chamadas a funções, não!

A invocação de um método é na verdade uma **mensagem** para outro
objecto:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># Este</span>
<span class="mi">1</span> <span class="o">+</span> <span class="mi">2</span>
<span class="c1"># E' o mesmo que este...</span>
<span class="mi">1</span><span class="p">.</span><span class="nf">+</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="c1"># Que e' o mesmo que este:</span>
<span class="mi">1</span><span class="p">.</span><span class="nf">send</span> <span class="s2">"+"</span><span class="p">,</span> <span class="mi">2</span></code></pre></figure>

### Blocos são Objectos, só que estes ainda não o sabem

Blocos (fechos, na verdade) são extremamente usados na biblioteca
*standard*. Para chamar um bloco, poderá usar `yield`, ou torná-lo num
`Proc` adicionando um argumento especial à lista de argumentos, como:

Blocks (closures, really) are heavily used by the standard library. To
call a block, you can either use `yield`, or make it a `Proc` by
appending a special argument to the argument list, like so:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">block</span><span class="p">(</span><span class="o">&amp;</span><span class="n">o_bloco</span><span class="p">)</span>
  <span class="c1"># Aqui dentro, o_bloco é o bloco passado ao método o_bloco</span>
  <span class="n">o_bloco</span> <span class="c1"># devolve o bloco</span>
<span class="k">end</span>
<span class="n">somador</span> <span class="o">=</span> <span class="n">block</span> <span class="p">{</span> <span class="o">|</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="o">|</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> <span class="p">}</span>
<span class="c1"># somador e' agora um objecto Proc</span>
<span class="n">adder</span><span class="p">.</span><span class="nf">class</span> <span class="c1"># =&gt; Proc</span></code></pre></figure>

Também, poderá criar blocos fora de chamadas a métodos: chamando
`Proc.new` com um bloco; ou chamando o método `lambda`.

Da mesma forma, métodos são também Objectos:

Similarly, methods are also Objects in the making:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="nb">method</span><span class="p">(</span><span class="ss">:puts</span><span class="p">).</span><span class="nf">call</span> <span class="s2">"puts e' um objecto!"</span>
<span class="c1"># =&gt; puts e' um objecto!</span></code></pre></figure>

### Operadores e Açúcar Sintáctico

A maioria dos operadores em Ruby são somente açúcar sintático (com
algumas regras de precedência) para chamadas a métodos. Poderá, por
exemplo, redifinir o método + da classe Integer:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Integer</span>
  <span class="c1"># Pode fazer, mas por favor não faça isto</span>
  <span class="k">def</span> <span class="nf">+</span><span class="p">(</span><span class="n">outro</span><span class="p">)</span>
    <span class="nb">self</span> <span class="o">-</span> <span class="n">outro</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

Não necessita do `operador+`, etc., do C++.

Pode ainda ter um acesso no estilo de um array se definir os métodos
`[]` e `[]=`. Para definir as operações unárias + e – (pense em +1 e
-2), tem que definir os métodos `+@` e `-@`, respectivamente.

Os operadores abaixo não são, no entanto, açúcar sintáctico.Não são
métodos, e não podem ser redifinidos:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="o">=</span><span class="p">,</span> <span class="o">..</span><span class="p">,</span> <span class="o">...</span><span class="p">,</span> <span class="ow">not</span><span class="p">,</span> <span class="o">&amp;&amp;</span><span class="p">,</span> <span class="ow">and</span><span class="p">,</span> <span class="o">||</span><span class="p">,</span> <span class="ow">or</span><span class="p">,</span> <span class="o">::</span></code></pre></figure>

Como `+=`, `*=` etc. são somente abreviações para `var = var + outra_var`,
`var = var * outra_var`, etc. não podem ser redefinidos.

## Mais informação

Quando se sentir preparado para saber mais sobre Ruby, veja a nossa
secção de [Documentação](/pt/documentation/).



[faq]: http://ruby-doc.org/docs/ruby-doc-bundle/FAQ/FAQ.html
