Slides do minicurso da linguagem Ruby + Sinatra, com duração de cerca de 8 horas, realizado no segundo semestre de 2016 na UDESC, Campus São Bento do Sul (CEPLAN)
dinâmica (variáveis e parâmetros de função não tem tipo definido) • Pensada para ter um código enxuto e ser de fácil leitura ◦ O código se parece mais com o inglês escrito, e possui menos símbolos como parênteses, chaves, etc. 3
objeto, até mesmo números, strings, booleanos e mesmo "nil" • Há várias maneiras de se fazer uma mesma coisa • Entrevista com o criador: ◦ http://www.artima.com/intv/ruby.html 4
o caractere de quebra de linha ("\n") puts 'Olá,' puts 'mundo!' => Olá, => mundo • O "print" imprime sem a quebra de linha print 'Olá, ';print 'mundo!' => Olá, mundo! 10
posição não existe. Use "fetch" se quiser uma exceção para um posição inexistente arr = ["joão", "maria", "josé"] puts arr[10] => nil puts arr.fetch(10) => IndexError: index 10 out of array bounds 25
Elas servem, por exemplo, para validar se uma string bate com um determinado padrão /\A[a-z]+\z/.match "string" #contém apenas letras minúsculas /\A[A-z]+\z/.match "string" #contém apenas letras # CPF /\A\d\d\d\.\d\d\d\.\d\d\d\-\d\d\z/.match "000.000.000-00" # E-mail /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i 34
na função def faca_algo puts "Antes" yield "Olá" yield "mundo" puts "Depois" end faca_algo do |parametro| puts parametro end => Antes => Olá => mundo => Depois 39
atributo class Pessoa def initialize(nome, idade) @nome = nome @idade = idade end def debug "#{@nome} tem #{@idade} anos" end end pessoa = Pessoa.new "João", 20 puts pessoa.debug => João tem 20 anos 42
necessário criar métodos para acessar e modificar os valores (getter e setter). class Pessoa def nome=(novo_nome) @nome = novo_nome end def nome @nome end end pessoa = Pessoa.new pessoa.nome = "Pedro" puts pessoa.nome => Pedro 43
initialize(especie) @especie = especie end end class Cao < Animal attr_accessor :raca def initialize(especie, raca) super especie @raca = raca end end c = Cao.new "Cão", "Vira-lata" puts c.especie # "Cão" puts c.raca # "Vira-lata" 46
inclusive as nativas do Ruby class String def adiciona_exclamacao! self << '!!!' end end str = 'Funciona' str.adiciona_exclamacao! puts str => "Funciona!!!" 47
initialize(nome) @nome = nome end def ==(outra_pessoa) @nome == outra_pessoa.nome end end john = Pessoa.new "John" outro_john = Pessoa.new "John" puts john == outro_john => true 49
foi definida Pessoa = Class.new # equivalente à "class Pessoa;end" # retorna métodos da classe puts Pessoa.instance_methods # definindo um método Pessoa.class_eval do define_method :ola do |nome| puts "Olá, #{nome}" end end # chamando um método Pessoa.new.send :ola, "Fulano" # equivalente à Pessoa.new.ola("Fulano") 52
recupera uma exceção begin raise 'Lançando uma exceção' rescue puts 'Se recuperando de um erro' end begin num = 5 / 0 rescue ZeroDivisionError => e puts "Houve um erro: #{e}" end 55
biblioteca nativa para gerar HTML a partir do Ruby ◦ Como convenção do Sinatra, os arquivos .erb ficam na pasta "/views" /app /app/app_sinatra.rb /app/views/ /app/views/pagina1.erb /app/views/pagina2.erb 65
variáveis acessíveis de dentro do template require 'sinatra' get '/' do # chama arquivo "um_template.erb" erb :um_template, locals: { uma_variavel: "...", outra_variavel: "..." } end 66
do # executa views/form_login.erb erb :form_login end post '/login' do login_correto = false if params['usuario'] == 'fulano' && params['senha'] == 'abc123' login_correto = true end erb :login, locals: {login_correto: login_correto} end 71
usuário que está logado, um carrinho de compras de um e-commerce, etc require 'sinatra' enable :sessions post '/login' do if params['usuario'] = 'x' && params['senha'] == 'y' session['usuario_logado'] = params['usuario'] end end # ERB <% if session['usuario_logado'] %> <p>Bem vindo, <%= session['usuario_logado'] %></p> <% end %> 78