Open vanderleipinto opened 6 months ago
Faça uma função que receba uma string e retorne verdadeiro caso ela seja palíndromo, do contrário ela deve retornar falso. (palíndromos são palavras ou frases que podem ser lidas da esquerda para a direita ou da direita para a esquerda.)
def palindrome?(word)
return word == word.reverse
end
Faça uma função que receba uma string contendo um CPF e verifique se ele está formatado de acordo com a máscara 999.999.999-99. A função deve usar regex para fazer a validação da máscara e deve retornar verdadeiro ou falso. cpf = “461.636.517-23”
def cpf_mask?(cpf)
return cpf.match?(/^\d{3}\.\d{3}\.\d{3}-\d{2}$/)
end
O fatorial de um número n!, é definido como o produto de todos os números inteiros de 1 a n. Por exemplo: 5! é 5 4 3 2 1 = 120 A maioria das implementações de cálculo de fatoriais usam uma função recursiva para determinar o valor fatorial(n). No entanto, a maioria dos sistemas não consegue lidar com pilhas de recursividade maiores que 2000. Implemente uma função para calcular o fatorial de números arbitrariamente grandes, sem utilizar recursividade. Regras ● n < 0 deve retornar nil ● n = 0 deve retornar 1 ● n > 0 deve retornar n!
def fatorial(n)
return nil if n < 0
return 1 if n == 0
result = 1
(1..n).each do |i|
result *= i
end
result
end
A partir das tabelas do banco de dados abaixo, escreva uma query sql que através de join, retorne o nome completo, cpf, equipe e cargo dos colaboradores ordenando os por cpf.
Tabela employees | first_name | last_name | cpf | team_id | job_title_id |
---|---|---|---|---|---|
Pedro | Alves | 665.415.876-80 | 2 | 3 | Cell |
Tiago | Nogueira | 032.336.130-75 | 1 | 1 | Cell |
João | Neves | 461.636.517-23 | 1 | 2 | Cell |
Tabela teams | id | name |
---|---|---|
1 | Ti | |
2 | Suporte | |
3 | Financeiro |
Tabela job_titles
id | name |
---|---|
1 | Desenvolvedor back-endimpr |
2 | Desenvolvedor front-end |
3 | Encantador de clientes |
SELECT CONCAT(employees.first_name,' ', employees.last_name) AS full_name,
cpf, teams.name AS equipe,
job_titles.name AS cargo FROM employees
JOIN teams ON employees.team_id = teams.id
JOIN job_titles ON employees.job_title_id = job_titles.id
ORDER BY CPF;
class Employee < ApplicationRecord
belongs_to :team
belongs_to :job_title
end
class Team < ApplicationRecord
has_many :employees
end
class JobTitle < ApplicationRecord
has_many :employees
end
employee = Employee.joins(:team, :job_title)
.select("CONCAT(employees.first_name, ' ', employees.last_name) AS full_name, employees.cpf, teams.name AS equipe, job_titles.name AS cargo")
.order(:cpf)
employee.each do |employee|
puts "Nome completo: #{employee.full_name}, CPF: #{employee.cpf}, Equipe: #{employee.equipe}, Cargo: #{employee.cargo}"
end
O comando a ||= b
é um exemplo de operador de atribuição condicional, comumente utilizado em muitas linguagens de programação, incluindo Ruby. Ele é amplamente utilizado devido à sua conveniência e legibilidade. Vamos explicar o que este comando faz e por que é tão popular:
O que faz: O operador ||=
atribui o valor de b
a a
somente se a
for considerado falso ou nulo (ou seja, se a
for nil
ou false
). Se a
já tiver um valor verdadeiro, a expressão a ||= b
não faz nada, deixando a
com seu valor atual.
Por que é amplamente utilizado:
||=
é uma forma concisa de atribuir um valor padrão a uma variável, caso essa variável ainda não tenha sido definida ou esteja indefinida.||=
é mais claro e legível do que uma sequência de condições e atribuições explícitas. Ele expressa de forma direta a intenção de atribuir um valor padrão a uma variável apenas se ela não tiver sido atribuída anteriormente.No geral, o operador ||=
é uma ferramenta poderosa para inicializar variáveis de forma segura e expressiva em Ruby e é valorizado pela sua eficácia em manter o código limpo e legível.
A principal diferença entre esses dois métodos está na sintaxe e nas convenções de nomenclatura das linguagens Ruby e Java.
Sintaxe:
empty?
é definido como uma função comum, usando a palavra-chave def
, seguida do nome do método e seus parâmetros entre parênteses. O corpo do método é delimitado por end
.isEmpty
é definido dentro de uma classe (provavelmente uma classe utilitária ou de manipulação de strings) usando a palavra-chave public
, indicando que o método pode ser acessado de fora da classe. A palavra-chave boolean
indica que o método retorna um valor booleano (true
ou false
). O método é declarado como isEmpty
e recebe um parâmetro do tipo String
. O corpo do método é delimitado por chaves {}
.Convenções de Nomenclatura:
empty?
, seguindo a convenção de que métodos que retornam um valor booleano (verdadeiro ou falso) terminam com um ponto de interrogação (?
). Isso ajuda a indicar claramente a intenção do método, que é verificar se algo está vazio.isEmpty
, seguindo a convenção de que métodos que verificam se uma coleção ou estrutura de dados está vazia são geralmente nomeados com isEmpty
. Essa é uma convenção comum em Java, mas não é uma regra absoluta.Além disso, as duas linguagens têm diferenças em relação ao uso de métodos de acesso para propriedades de objetos. Em Ruby, você geralmente usa métodos de acesso como size
, length
, empty?
, entre outros, diretamente no objeto. Em Java, você geralmente usa métodos de acesso como length()
diretamente em um objeto e usa o valor retornado em comparações, como no caso do método isEmpty
.
Portanto, a principal diferença entre esses dois métodos é a sintaxe específica da linguagem e as convenções de nomenclatura adotadas em Ruby e Java.
O self
em classes Ruby é uma palavra-chave especial que se refere ao próprio objeto em que o código está sendo executado. É como um pronome que permite acessar os atributos e métodos do objeto dentro de seu contexto.
Funções do self:
self.atributo
recupera o valor do atributo atributo
do objeto atual.self.método(argumentos)
chama o método método
do objeto atual com os argumentos fornecidos.self
pode ser passado como argumento para outros métodos, permitindo que o objeto seja manipulado por esses métodos.self
dentro de um método de instância se refere à instância específica, enquanto dentro de um método de classe, o self
se refere à classe em si.Exemplos:
class Pessoa
attr_accessor :nome
def initialize(nome)
self.nome = nome
end
def apresentar
puts "Meu nome é #{self.nome}"
end
end
pessoa = Pessoa.new("João")
pessoa.apresentar # Imprime "Meu nome é João"
No exemplo acima, self
é usado dentro do método initialize
para acessar o atributo nome
e dentro do método apresentar
para recuperar o nome da instância específica da classe Pessoa
.
Importância do self:
O self
é fundamental para a programação orientada a objetos em Ruby, pois permite que os objetos sejam manipulados de forma flexível e eficiente. Ele facilita o acesso aos atributos e métodos do objeto, tornando o código mais legível e reutilizável.
Dicas para usar o self:
self
para acessar atributos e métodos: Isso garante que o código seja claro e que você esteja acessando os membros do objeto correto.self
desnecessariamente: Se o contexto já estiver claro, não há necessidade de usar self
.self
pode mudar dependendo de onde ele é usado no código.1. Código mais conciso: A ausência de declarações de tipo torna o código mais enxuto e fácil de ler e escrever.
2. Flexibilidade: Permite que o tipo de uma variável seja alterado durante a execução, proporcionando maior flexibilidade e adaptabilidade.
3. Desenvolvimento rápido: Facilita a criação de protótipos e testes rápidos de ideias, agilizando o processo de desenvolvimento.
4. Metaprogramação: Permite a manipulação de código em tempo de execução, abrindo portas para técnicas avançadas de desenvolvimento.
5. Expressividade: A tipagem dinâmica pode ser vista como mais natural e expressiva, permitindo que o código se concentre na lógica e não nos tipos.
1. Erros em tempo de execução: Erros de tipo só são detectados durante a execução, o que pode levar a bugs difíceis de identificar.
2. Dificuldade de depuração: A falta de informações de tipo pode dificultar a depuração de erros, especialmente para programadores menos experientes.
3. Código menos robusto: A flexibilidade da tipagem dinâmica pode levar a código menos robusto e com maior probabilidade de falhas.
4. Dificuldade de documentação: A falta de informações de tipo pode dificultar a documentação do código e sua compreensão por outros programadores.
5. Desempenho: Em alguns casos, a tipagem dinâmica pode levar a um desempenho inferior em comparação com linguagens estaticamente tipadas.
Em resumo:
A tipagem dinâmica do Ruby oferece vantagens em termos de concisão, flexibilidade e agilidade no desenvolvimento. No entanto, é importante estar ciente das desvantagens, como a maior probabilidade de erros em tempo de execução e a dificuldade de depuração. A escolha de Ruby deve levar em consideração o estilo de programação, o tipo de projeto e as necessidades específicas do desenvolvedor.
Recursos adicionais:
[x] 1) Faça uma função que receba uma string e retorne verdadeiro caso ela seja palíndromo, do contrário ela deve retornar falso. (palíndromos são palavras ou frases que podem ser lidas da esquerda para a direita ou da direita para a esquerda.)
[x] 2) Faça uma função que receba uma string contendo um CPF e verifique se ele está formatado de acordo com a máscara 999.999.999-99. A função deve usar regex para fazer a validação da máscara e deve retornar verdadeiro ou falso. cpf = “461.636.517-23”
[x] 3) O fatorial de um número n!, é definido como o produto de todos os números inteiros de 1 a n. Por exemplo: 5! é 5 4 3 2 1 = 120 A maioria das implementações de cálculo de fatoriais usam uma função recursiva para determinar o valor fatorial(n). No entanto, a maioria dos sistemas não consegue lidar com pilhas de recursividade maiores que 2000. Implemente uma função para calcular o fatorial de números arbitrariamente grandes, sem utilizar recursividade. Regras ● n < 0 deve retornar nil ● n = 0 deve retornar 1 ● n > 0 deve retornar n!
[x] 4) A partir das tabelas do banco de dados abaixo, escreva uma query sql que através de join, retorne o nome completo, cpf, equipe e cargo dos colaboradores ordenando os por cpf.
Tabela job_titles
[x] 5) Usando as tabelas do banco de dados do exercício anterior, escreva as classes das models Employee, Team e JobTitle, declare as associações das models e escreva a mesma query com a sintaxe do ActiveRecord.
[x] 6) Descreva o que faz o seguinte comando e por que ele é amplamente utilizado: a ||= b
[x] 7) Qual a principal diferença entre estes dois métodos?
[x] 8) Qual o significado do self nas classes ruby?
[ ] 9) Quais as vantagens e desvantagens do ruby ser uma linguagem dinamicamente tipada?