Skip to content

Instantly share code, notes, and snippets.

@danilobatistaqueiroz
Last active September 27, 2018 13:36
Show Gist options
  • Select an option

  • Save danilobatistaqueiroz/01d64f1501b938241d70855b075754c9 to your computer and use it in GitHub Desktop.

Select an option

Save danilobatistaqueiroz/01d64f1501b938241d70855b075754c9 to your computer and use it in GitHub Desktop.
ruby essentials

Tipagem
Por não ser necessária a declaração do tipo, muitos pensam que a linguagem Ruby é fracamente tipada
e com isso o tipo não importaria para o interpretador.
No Ruby os tipos são importantes sim para a linguagem, tornando-a fortemente tipada, além disso,
o Ruby também é implicitamente e dinamicamente tipada, implicitamente tipada pois os tipos são inferidos pelo interpretador,
não precisam ser declarados e dinamicamente tipada porque o Ruby permite que o tipo da variável possa ser alterado
durante a execução do programa

Strings Mutáveis
A principal característica das Strings em Ruby é que são mutáveis, diferente do Java

O operador << é utilizado para a operação append de Strings, ou seja, para a concatenação de Strings em uma mesma instância.
Já o operador + também concatena Strings mas não na mesma instância, isso quer dizer que o + gera novas Strings.

Símbolos
Símbolos também são texto, como as Strings. Só que devem ser precedidos do carácter ':', ao invés de aspas e pertencem à classe Symbol Símbolos são análogos às Strings do Java. As Strings do Ruby estão mais para o StringBuilder do Java. Por serem imutáveis e compartilhados, objetos Symbol geralmente são usados como identificadores e para nomenclatura (labels).

Em Ruby tudo é objeto

Os únicos objetos de valor booleano false são o próprio false e o nil.
Portanto, qualquer valor pode ser usado como argumento do if

O operador ||= atribui um valor apenas a variável esteja vazia. é muito utilizado para carregar valores de maneira "lazy". nome ||= "anonimo" Nesse caso, se nome é nulo, ele será preenchido com "anonimo".

to_s() é um método comum "transforma" um objeto em uma String, geralmente usado para log.

métodos (class, object_id) todo objeto possui.

criando um objeto

objeto = Object.new()

def é uma palavra chave do Ruby para a definição (criação) de métodos

Mas, e o retorno de um método? Como funciona? Para diminuir o excesso de código que as linguagens costumam introduzir (chamado de ruído sintático), o Ruby optou por retornar o resultado da execução da última instrução executada no método

Seguindo a ideia de envio de mensagens, uma maneira alternativa de chamar um método é usar o método send(), que todo objeto em Ruby possui. pessoa.send(:fala)

Qualquer classe em Ruby pode ser reaberta e qualquer método redefinido. Inclusive classes e métodos da biblioteca padrão, como Object e Fixnum.

imos que todo método é sempre chamado em um objeto. Quando não especificamos o objeto em que o método está sendo chamado, Ruby sempre assume que seja em self.
self é similar ao this de outras linguagens.
Como tudo em Ruby é um objeto, todas as operações devem ser métodos.

Repare que a variável nome é uma variável de instância de Restaurante. Em ruby, o "@" definiu esse comportamento.

class Restaurante
  def initialize(nome)
    puts "criando um novo restaurante: #{nome}"
    @nome = nome
  end

  # altere o método qualifica
  def qualifica(msg="Obrigado")
    puts "A nota do #{@nome} foi #{@nota}. #{msg}"
  end  
  
  # propriedades
  def nota=(nota)
    @nota = nota
  end
  
  def nota
    @nota
  end
    
end

Seria muito trabalhoso definir todas as propriedades de acesso a nossa variáveis. Refatore a classe Restaurante para utilizar o attr_accessor :nota Seu arquivo final deve ficar assim:

class Restaurante
  attr_accessor :nota

  def initialize(nome)
    puts "criando um novo restaurante: #{nome}"
    @nome = nome
  end

  def qualifica(msg="Obrigado")
    puts "A nota do #{@nome} foi #{@nota}. #{msg}"
  end  

end

restaurante_um = Restaurante.new("Fasano")
restaurante_dois = Restaurante.new("Fogo de Chao")

restaurante_um.nota = 10
restaurante_dois.nota = 1

restaurante_um.qualifica
restaurante_dois.qualifica("Comida ruim.")

Arrays em Ruby são instâncias da classe Array, não sendo simplesmente uma estrutura de dados, mas possuindo diversos métodos auxiliares que nos ajudam no dia-a-dia.

O Ruby possui arrays, que são listas que podem guardar qualquer tipo de objeto e não precisam ser criadas com tamanho determinado; novos ítens podem ser adicionados a qualquer momento

Arrays só podem ter índices numéricos. Os índices começam em 0 e também podem ser acessados de forma negativa

Um outro tipo de estrutura de dados do Ruby é o Hash. Hashes são como arrays, com a diferença que o índice de um hash pode ser qualquer objeto.

O Ruby define o tipo nulo através do objeto nil, que é uma instância da classe NilClass.

Para definir uma classe use a palavrachave class. Classes são constantes e, por este motivo, devem começar com uma letra maiúscula.

Esta criação de getters e setters em classes é tão comum que o próprio Ruby fornece uma maneira de automatizar esta definição. Basta usar os métodos Module#attr_reader e Module#attr_writer.

Para os casos onde você sempre define tanto o getter quanto o setter, é possível usar o método Module#attr_accessor, que fará isso de uma vez só!

Um exemplo que demonstra uma aparição de arrays é a chamada ao método methods, que retorna uma array com os nomes de todos os métodos que o objeto sabe responder naquele instante. Esse método é definido na classe Object então todos os objetos o possuem: cliente = "Petrobras"

puts cliente.methods

Ruby não possui tipagem explícita

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment