Ruby on Rails Fullstack

ARRAYS E ITERADORES

EACH


# Incrementa 1 a cada elemento da array

arr = [1,2,3,4,5]

arr.each do |element|
    element += 1
end

#=> [2,3,4,5,6]


# One line each

arr.each { |element| element +=1 }

#=> [3,4,5,6,7]
  • Itera sobre cada elemento da array
  • Não retorna nada, apenas executa o código

EACH_WITH_INDEX


# Incrementa 1 a cada elemento da array, exceto do 3º

arr = [1,2,3,4,5]

arr.each_with_index do |element, index|
    unless index == 2
        element += 1
    end
end

#=> [2,3,3,5,6]


# One line each

arr..each_with_index { |element, index| element +=1 unless index == 2 }

#=> [3,4,3,6,7]
  • Itera sobre cada elemento da array
  • Lembra da posição em que está
  • Não retorna nada, apenas executa o código

MAP


# Cria uma nova array de números elevados ao quadrado

arr = [1,2,3,4,5]

sqr = arr.map do |element|
    return element * element
end

#=> arr = [1,2,3,4,5]
#=> sqr = [1,4,9,16,25]


# Sobrescreve a array por números elevados ao quadrado

arr.map! { |element| element * element }

#=> arr = [1,4,9,16,25]
  • Itera sobre cada elemento da array
  • Retorna uma array de elementos retornados

SELECT / REJECT


# Retorna uma array apenas de números pares

arr = [1,2,3,4,5]

arr.select do |element|
    element % 2 == 0
end

#=> [2,4]
  • Itera sobre cada elemento da array
  • Retorna uma array de elementos que passaram (ou não) na condição dada

# Retorna uma array apenas de números ímpares

arr = [1,2,3,4,5]


arr.reject { |element| element % 2 == 0 }


#=> [1,3,5]

BLOCOS

(Nivel Hard)

COMO PARECEM?


# Bloco de múltiplas linhas

do |var|
    return var * var
end

# Bloco de uma linha


{ |var| var * var }

Obs.: Se não tiver a keyword return , retorna por padrão o que for obtido na última linha

O QUE FAZER COM ELES?


# Bloco de múltiplas linhas 
# aplicado ao each

arr.each do |element|
    element += 1
end

# Bloco de uma linha
# Aplicado ao map


arr.map{ |element| element * element }

Argumentos de funções, como each e map!

UTILIZANDO BLOCOS


# defina seu método. Quando quiser executar o bloco,
# utilize a keyword yield

def timer
    puts "Vamos começar"
    start = Time.now
    yield                                             #=> executa o bloco!
    end = Time.now
    puts "O bloco demorou #{start - end}s pra executar."
end


# Ao chamar seu método, passe um bloco

timer() do
    puts "partiu naninha"
    sleep(4)
    puts "brincadeeira"
end

# pode ser de uma linha só

timer() { sleep(1) }

UTILIZANDO BLOCOS (AVANÇADO)


# defina seu método. Quando quiser executar o bloco,
# utilize a keyword yield

def timer(nomezin)
    puts "Vamos começar"
    nomezao = name.upcase
    yield(nomezao)              #=> executa o bloco e passa um argumento!
    name2 = "Obama"
    yield(name2)                #=> executa o bloco e passa um argumento!
    puts "Pretty cool, huh?"
end


# Ao chamar seu método, passe um bloco que espera um argumento

timer("Putin") do |name|
    puts "Olá, #{name}!"
end

# pode ser de uma linha só

timer("trump") { |name| puts "#{name} já foi presidente, sabia??" }

HASHES

O PROBLEMA DE UMA ARRAY


test = [["Fantini", "BCC", 18], ["Slash", "BCC", "017"], ["Camila", "Bio", "015"]]

# Cada array dentro da array (aka 'mini_array') equivale a um aluno do test
# Cada posição da mini_array equivale a um dado específico

test << ["BCC", "015", "Goleiro"]

# Como mostrar todos os nomes???

A SOLUÇÃO DE UMA HASH (1)


# Hash relaciona 'keys' e 'values'. É como um dicionário

aluno = {
    nome:   'Goleiro',
    curso:  'BCC',
}

# Adicionando uma nova informação à Hash ==> hash[:key] = value
aluno[:ano] = '015'

# Lendo uma informação da hash ==> hash[:key]
aluno[:nome]     #==> 'Goleiro'

# Atualizando uma informação da hash ==> hash[:key] = value
aluno[:ano] = '019'

# Deletando uma informação da hash ==> hash.delete(:key)
aluno.delete(:curso)    #==> 'BCC'

A SOLUÇÃO DE UMA HASH (2)


test = [
    {nome: "Goleiro", curso: "BCC", ano: '015'}, 
    {nome: "Sofia", curso: "BCC" },
    {curso: "Bio", ano: '015'}
]

# Cada array dentro da array (aka 'mini_array') equivale a um aluno do TeSt
# Cada posição da mini_array equivale a um dado específico

test << {curso: "BCC", ano: "015", nome: "Daniel"}

# Como mostrar todos os nomes???

ITERANDO SOBRE UMA HASH


# O #each sobre uma hash dá 2 parâmetros ao meu bloco

aluno.each do |key, value|
    puts "O #{key} do(a) aluno(a) é #{value}"
end

# Caso queira iterar só sobre as keys...

aluno.each_key do |key|
    puts "O #{key} do(a) aluno(a) está registrado!"
end

# ...Ou só sobre os values...
aluno.each_value do |value|
    puts "O #{value} do(a) aluno(a) está registrado!"
end

Your turn!

O carrinho de compras

Faça a lógica de um mercado, com lista de itens a comprar e um carrinho dos itens selecionados. O programa deve ter algumas funcionalidades principais:

  • Uma interface para escolher se quer comprar, desfazer ou finalizar a compra
  • Uma lista de itens pré-definidos para @ usuári@ escolher (e decidir quantos quer comprar)
  • Um "carrinho de compras" que sinalizam o que (e quantos) itens @ usuári@ comprou até o momento
  • Um "relatório final" ao finalizar a compra, mostrando todos os itens comprados e o valor total da compra
Made with Slides.com