Ruby (2/2) André Braga Patrícia Lustosa Intro • Peguem a aula de ontem em /~plvr para ter como referência para os exercícios de hoje Exercício • Construa uma Expressão Regular para buscar por padrões que contenham a expressão “~if734” e que não tenham: – Nenhum número imediatamente após – Nenhum espaço em branco diretamente antes, mas haja algum outro dígito • Faça um método para calcular o fatorial de um número usando a estrutura de controle times 1) Métodos Return Values • Métodos retornam o valor do último statement avaliado • Um return statement explícito também pode ser usado Default Value Argument • Valor default de um parâmetro pode ser especificado durante a definição de um método Variable Length Argument List • Último parâmetro de um método pode ser precedido por * indicando que mais de um parâmetro pode ser passado para a função • Esses parâmetros são colecionados e um array é criado Array Argument • Asterístico (*) também pode ser usado para preceder um array passado como parâmetro para um método • O array é expandido e os parâmetros são passados como se tivessem separados por vírgulas Hash Argument • Hash pode ser passado quando uma função é invocada • Une o melhor dos dois mundos: paramêtros com nome e quantidade de parâmetros variável Declarando Visibilidade • Por default, todos os métodos são public • O acesso pode ser restringido através dos métodos public, protected ou private – Não são palavras chave, mas sim métodos que operam na classe, alterando dinamicamente a visibilidade dos métodos Declaring Visibility • Se private for chamado sem argumentos, ele seta para private todos os métodos subsequentes Declaring Visibility Exercício • Defina uma classe Funcionário que contém um construtor que recebe um nome e n dependentes (n >= 0) • Crie um novo funcionário com 3 dependentes e imprima-os 2) Blocos O que são blocos? • Funções (ou pedaçoes de código) anônimas • Bloco como parâmetro para uma função – Realizar iterações passando elementos como parâmetro para a “função anônima”-parâmetro Passando blocos • yield() Blocos com parâmetros yield() pode receber os parâmetros do bloco Iteração • each, map, select, reject Reject funciona da mesma forma Map & ! new Exercício 1 • Faça um programa que crie uma PG com fator 7 de 15 números e: – Exclua os elementos menores que 36 – Crie um Hash com os elementos que sobrarem, onde a chave de cada elemento é o próprio valor no formato de String. – No final, imprima as chaves e valores do Hash. Dica: Vá no irb (Hash.methods) ou no fxri para descorir métodos da classe Hash. Exercício 2 • Use o código da questão anterior de forma que ele seja passado como um bloco para uma outra função. Esse bloco deve receber como parâmetro a quantidade de elementos da PG, o fator e o valor mínimo. 3) Exceções Exception Class • Exceções são implementadas como classes que herdam de Exception Exception Handling 4) DSL Embedded DSL • Embutir uma DSL em uma linguagem host pode ser usada para defini-la, no lugar de construir um compilador ou interpretador Embedded DSL • Embutir uma DSL em uma linguagem dinâmica é uma técnica conhecida – Sintaxe não-intrusiva – Habilidade de avaliar expressões a medida que elas aparecem no programa • Em uma embedded DSL, o designer extende as construções da linguagem host com construções de domínio específico ao invés de construir um parser Meta-modelos • Meta-modelo define a sintaxe abstrata de uma DSL • Uma linguagem de meta-modelagem pode ser considerada uma DSL para definir metamodelos Embedded DSL • Essa abordagem para implementar uma DSL gasta menos tempo do que um gerador de parser – Não há necessidade de lidar com gramática ou árvore sintática abstrata • Por outro lado, definir uma sintaxe abstrata arbitrária é impossível, porque há a limitação da sintaxe da linguagem host 5) Ruby on Rails Práticas-padrão Convention over Configuration Adaptabilidade Don’t Repeat Yourself (DRY) Agile Development Environment Geração de código Testes Recompilação, deploy… Alguns pontos • Migrations – Gerencia evolução de um schema (BD) • Rake – Linguagem de “build” para Ruby – Automatiza tarefas: create e drop de tabelas, testes, atualiza arquivos de suporte, etc. • Generator • URL Routing – Permite expressões regulares Scaffolding • Cria “esqueleto” • Prototipação rápida • Padrões para: – Listar – Criar – Atualizar – Remover • Lógica e template defaults