O que é Ruby?

Ruby é uma linguagem de programação dinâmica de propósito geral orientada a objetos. Ela é muito utilizada para back-end com a famosa framework Ruby on Rails

Variáveis

Funcionam como em outras linguagens dinâmicas, como o Javascript e Python, simplesmente damos o nome e o valor, sem o tipo, pois é uma linguagem dinâmica:

# Em ruby, tudo o que estiver na frente de uma #(Hashtag) é comentário
a = "Rapaiz" #string
b = 10 #int
c = true #boolean
d = [1, 2, 3] #array

Ifs

Funcionam de maneira muito parecida com outras linguagens, só que não precisamos colocar os parêntesis e como não usamos os colchetes {} pra blocos de códigos nessa linguagem e sim end o usamos aqui também:

condicao1 = false

if condicao1
    puts "condicao1: verdade"
end

#Agora com else if e else:
condicao2 = 2
if condicao2 == 1
    puts "condicao2: 1"
elsif condicoa2 == 2
    puts "condicao2: 2"
else
    puts "condicao2: alguma outra coisa"
end

Loops

Como em outras linguagens, temos acesso aos clássicos, for e while, os usamos assim:

#repetir 10 vezes usando for:
for i in 0..10
    puts "For: " + i.to_s()
end

#repetir 20 vezes com while
condicao = true
contWhile = 0
while condicao
    puts "while: " + contWhile.to_s()
    contWhile += 1
    if contWhile == 20
        condicao = false
    end
end

Funções

Mais parecido com o python, simplesmente usamos a palavra-chave def para definirmos funções próprias:

def algumaCoisa()
    puts "Alguma coisa muito importante. Mais alguma coisa também importante. Mais alguma outra coisa, absolutamente essencial"
end

algumaCoisa()

#Agora com parâmetros
def outraCoisa(coisa)
    puts "outraCoisa é " + coisa
end

outraCoisa("abobrinha")

OOP (Object oriented Programming)

Antes de aprendermos o que é OOP, precisamos entender o que é um paradigma da programação, que nada mais é do que uma maneira de escrever código, ou seja, um padrão seguido em linguagens e bibliotecas para ajudar um programador a resolver um problema, sendo o mais famoso dos paradigmas, o OOP.

OOP (Object oriented programming) é um paradigma da programação que se baseia na ideia de separar código em objetos (não se preocupe, isso ainda fará sentido). Um objeto é uma coleção de propriedades e funções que fazem sentido juntos. Por exemplo: até agora no Javascript que fizemos no navegador, nós usamos o console.log(mensagem) para nos comunicarmos com o console do navegador certo? Bem, preste atenção no que você estava digitando, você estava falando pro console fazer um log com a mensagem que você definiu, você estava falando pro objeto console executar a função log.

Ainda não ficou muito claro? Então vamos para uns exemplos usando Ruby que mostrarão a praticidade da programação orientada a objetos na prática:

RPG com personagens, versão 1 (Sem objetos)

Observe o seguinte código, nele criamos um personagem com vários atributos usando variáveis e fazemos um puts para criar um parágrafo descrevendo todos os atributos do personagem:

nome = "Roberto"
idade = 20
vida = 100
inteligencia = 70
forca = 10
destreza = 20
sabedoria = 40
carisma = 50
inventar\io = [ "espada", "pocao", "botas", "calcas", "chapeu", "escudo"]

puts "O " + nome + " tem " + idade.to_s() + " anos e está com " + vida.to_s() + " pontos de vida. Os atributos dele sao: " + inteligencia.to_s() + " de inteligencia, " + forca.to_s() + " de força, " + destreza.to_s() + " de destreza, " + carisma.to_s() + " de carisma. " + nome + " tem " + inventario.to_s() + " no inventário dele"

Se você executar esse código, aparecerá no console a seguinte mensagem:

O Roberto tem 20 anos e está com 100 pontos de vida. Os atributos dele sao: 70 de inteligencia, 10 de força, 20 de destreza, 50 de carisma. Roberto tem [“espada”, “pocao”, “botas”, “calcas”, “chapeu”, “escudo”] no inventário dele

Bem, o código funciona e não tem nada de errado nele, então vamos adicionar mais um personagem:

nome1 = "Rodolfo"
idade1 = 30
vida1 = 150
inteligencia1 = 80
forca1 = 20
destreza1 = 5
sabedoria1 = 50
carisma1 = 1
inventario1 = [ "Machado", "pocao", "sapato", "calcas sociais", "cartola", "camisa social"]

puts "O " + nome1 + " tem " + idade1.to_s() + " anos e está com " + vida1.to_s() + " pontos de vida. Os atributos dele sao: " + inteligencia1.to_s() + " de inteligencia, " + forca1.to_s() + " de força, " + destreza1.to_s() + " de destreza, " + carisma1.to_s() + " de carisma. " + nome1 + " tem " + inventario1.to_s() + " no inventário dele"

Se executarmos esse novo código, aparecerá além do parágrafo do nosso primeiro personagem:

O Rodolfo tem 30 anos e está com 150 pontos de vida. Os atributos dele sao: 80 de inteligencia, 20 de força, 5 de destreza, 1 de carisma. Rodolfo tem [“Machado”, “pocao”, “sapato”, “calcas sociais”, “cartola”, “camisa social”] no inventário dele

Então… a partir daqui as coisas começam a ficar meio feias. Se queremos criar um segundo personagem, repetimos bastante código e temos que modificar o nome das variáveis para que não se repitam com o do nosso primeiro personagem. E se quisermos adicionar mais personagens, mudar os atributos deles ou mudar o parágrafo gerado para cada personagem, vamos ter que modificar muito código em vários lugares. Tem que ter um jeito melhor… e tem, com OOP

RPG com personagens, versão 2 (Com classes)

Agora vamos modificar nosso código para utilizar classes, classes são basicamente modelos para objetos, eles definem o que objetos terão, o que poderemos fazer com objetos, como serão criados, etc.

class Personagem
    attr_accessor :nome, :idade, :vida, :destreza, :inteligencia, :forca, :sabedoria, :carisma, :inventario
    def initialize(nome, idade, vida, inteligencia, forca, destreza, carisma, inventario)
        @nome = nome
        @idade = idade
        @vida = vida
        @inteligencia = inteligencia
        @forca = forca
        @destreza = destreza
        @carisma = carisma
        @inventario = inventario
    end
end

roberto = Personagem.new("Roberto", 20, 100, 70, 10, 20, 40, [ "espada", "pocao", "botas", "calcas", "chapeu", "escudo"])

rodolfo = Personagem.new("Rodolfo", 30, 150, 80, 20, 5, 50, [ "Machado", "pocao", "sapato", "calcas sociais", "cartola", "camisa social"])

Mas ainda temos um problema, precisamos fazer aquele parágrafo gigantesco para cada personagem e modificar para cada um deles. Ou usar o poder das classes:

class Personagem
    #...
    def falarStats()
        puts "O " + self.nome + " tem " + self.idade.to_s() + " anos e está com " + self.vida.to_s() + " pontos de vida. Os atributos dele sao: " + self.inteligencia.to_s() + " de inteligencia, " + self.forca.to_s() + " de força, " + self.destreza.to_s() + " de destreza, " + self.carisma.to_s() + " de carisma. " + self.nome + " tem " + self.inventario.to_s() + " no inventário dele"
    end
end

roberto = Personagem.new("Roberto", 20, 100, 70, 10, 20, 40, [ "espada", "pocao", "botas", "calcas", "chapeu", "escudo"])

rodolfo = Personagem.new("Rodolfo", 30, 150, 80, 20, 5, 50, [ "Machado", "pocao", "sapato", "calcas sociais", "cartola", "camisa social"])

roberto.falarStats()
rodolfo.falarStats()

Com esse nosso novo código o resultado será:

Roberto tem 100 pontos de vida O Roberto tem 20 anos e está com 100 pontos de vida. Os atributos dele sao: 70 de inteligencia, 10 de força, 20 de destreza, 40 de carisma. Roberto tem [“espada”, “pocao”, “botas”, “calcas”, “chapeu”, “escudo”] no inventário dele

O Rodolfo tem 30 anos e está com 150 pontos de vida. Os atributos dele sao: 80 de inteligencia, 20 de força, 5 de destreza, 50 de carisma. Rodolfo tem [“Machado”, “pocao”, “sapato”, “calcas sociais”, “cartola”, “camisa social”] no inventário dele

Tudo isso de maneira mais fácil de criar novos personagens e mudarmos como eles se comportam, basta modificar a classe em si