Aprendendo Ruby como um Dev JavaScript parte 1
Tags: javascript, ruby
Published: 2019-09-13 18:33:07

Fala Codecaster!! Trazemos para você mais um texto aqui na Publicação do Codecasts. Hoje o tema é Ruby. A motivação de trazer este conteúdo é devido ao fato de que recentemente eu tenho buscado estudar um pouco essa linguagem, mais a título de conhecimento. Sendo assim, como um Desenvolvedor Web que lida a mais de 2 anos com JavaScript, preferi traçar paralelos com a linguagem que mais amo, e de quebra solidificar o conhecimento passando ele a diante. Espero que esta série de textos possam te despertar a curiosidade a respeito dessa linguagem.

# O que é o Ruby?

Bem, não é o foco deste texto trazer todo o conhecimento de Ruby e sua filosofia. É um texto mais prático. Porém, recomendo alguns conteúdos que podem ser úteis caso você queira aprender do zero a linguagem (como estou fazendo):

* [Apostila de Ruby on Rails da Caelum](https://www.caelum.com.br/apostila-ruby-on-rails) - sim preferi começar por essa apostila, por ter uma pegada mais prática
* [A História de Ruby on Rails | Por que deu certo?](https://www.youtube.com/watch?v=oEorhw5r2Do) - vídeo de uma das maiores referências de Ruby noo Brasil, Fábio Akita
* [Vale a pena? Ruby on Rails (feat Akita e Lucas Caton)](https://www.youtube.com/watch?v=kxXrWuCshUs) - vídeo do canal do pessoal do DevNaEstrada
* [Documentação oficial do Ruby](https://www.ruby-lang.org/pt/documentation/)
* [Tutorial de Ruby](http://rubylearning.com/)

## Executando um código Ruby

Bem, dedico uma seção aqui para deixar uma dica para você. Procure dar preferência, quando possível, a usar docker para execução de algumas coisas. Existem projetos, como o [dockerize](https://github.com/tevun/dockerize), em que você não precisa instalar nada na sua máquina para rodar um script, por exemplo. Foi o que eu fiz com o Ruby. Ele não vem instalado no Linux, e não gostaria de instalá-lo. Portanto, fiz uso o Docker. Segue os passos:

```zsh
# num terminal zsh
docker run --name ruby_exec -v $(pwd):/home --rm -i -t -w=/home ruby:slim ruby <script>
```

Para facilitar sua vida, você pode criar uma função no ZSH. Eu, por exemplo, criei uma chamada ruby, que ficou assim:

```sh
# em seu .zshrc
function ruby() {
  docker run --name ruby_exec -v $(pwd):/home --rm -i -t -w=/home ruby:slim ruby $1
}
```

Dessa forma eu só digito no terminal `ruby script.rb` e pronto, ele vai executar o script Ruby para mim.


## Criando uma aplicação de terminal para cálculo de IMC


Bem, o objetivo aqui é abordar:

* Saída padrão de dados usando `puts` ou `print`
* Entrada padrão de dados usando a função `gets`
* Criação de sua própria função usando `def`
* Entendendo a estrutura condicional

Antes de mais nada, gostaria de convidá-lo a acessar o repositório meu de [estudos com ruby](https://github.com/emanuelgsouza/ruby-studies). O código para este texto é o [imc.rb](https://github.com/emanuelgsouza/ruby-studies/blob/master/imc.rb).

### Saída de dados padrão

Bem, como o texto fala de um programador com *background* em JavaScript aprendendo Ruby, sabemos que em JavaScript a principal forma de saída é o famoso *console.log*. Em Ruby, aprendemos que há duas formas principais de mostrar um dado na tela:

* **puts**: printa e pula uma linha
* **print**: só printa o dado na tela, sem pular linha

```ruby
puts "Hello World"
```

### Entrada padrão de dados

Em JavaScript, dependerá de onde estamos executando nosso código. Qual o contexto? Se for Node.js, por exemplo, teremos que capturar a entrada do usuário de uma forma não muito simples. Existem bibliotecas que nos ajudam nisso, [prompts](https://www.npmjs.com/package/prompts) é uma delas.

Já com Ruby, podemos fazer um simples gets, atribuindo para uma variável, que conseguimos capturar um `input` do usuário.

```ruby
# uso o print para que o promp para o usuário digitar o nome
# apareça no final da linha
print "Qual o seu nome: "
nome = gets
```

### Criando sua própria função

Para que eu consiga calcular o IMC, eu preciso da altura e peso da pessoa. Quando aprendemos a programar, aprendemos que código repetitivo colocamos em funções. Pois bem, precisamos criar uma função para mostrar um pergunta ao usuário e depois capturar a informação que ele digitar.

Com JavaScript, podemos criar funções de inúmeras formas, com função nominal, função anônima ou *arrow functions*. Já com Ruby, utilizamos a palavra reservada `def`, bem semelhante ao Python:

```ruby
def get_user_input(msg)
    print msg
    return gets
end
```

É importante notar que em Ruby usamos o [conceito de método](https://www.techotopia.com/index.php/Ruby_Methods), portanto, ao fazer suas pesquisas, se atente a essa nomenclatura.

### Condicionais

Por fim, a última parte da nossa abordagem é a categorização. Sabemos que o IMC possui categorias. Estaremos usando como referência [Wikipedia](https://pt.wikipedia.org/wiki/%C3%8Dndice_de_massa_corporal).

Para tanto, a decisão tomada foi criar uma função que retorna uma categoria a partir do IMC. Veja como ela ficou:

```ruby
def categorize(value)
    if (value < 17)
        return "Muito abaixo do peso"
    end

    case value
    when 17.1...18.49
        return "Abaixo do peso"
    when 18.5...24.99
        return "Peso normal"
    when 25...29.99
        return "Acima do peso"
    when 30...34.99
        return "Obesidade I"
    when 35...39.99
        return "Obesidade II (severa)"
    else
        return "Obesidade III (mórbida)"
    end
end
```

Algumas coisas nos chamam a atenção em comparação com JavaScript:

* O não uso de chaves `{}` para delimitar blocos. Isso ocorre pelo uso da identação
* O uso da expressão `end` para delimitar, também, o fim de um bloco de código
* E o range de dados, para delimitar um valor inicial e um valor final. Lindo demais :)

## Conclusões finais

Como dito, o objetivo deste texto é proporcionar uma experiência muito prática e até superficial a respeito da linguagem Ruby em comparação com JavaScript. Espero que possa ser de auxílio em algum nível.

Por fim, não deixe de conferir o [código completo](https://github.com/emanuelgsouza/ruby-studies/blob/master/imc.rb) no meu repositório.

Até a próxima!