forked from everaldo/ruby-em-100-exemplos
-
Notifications
You must be signed in to change notification settings - Fork 0
/
079_blocos_estimulam_uma_filosofia_passe_para_a_frente.rb
65 lines (51 loc) · 1.4 KB
/
079_blocos_estimulam_uma_filosofia_passe_para_a_frente.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 09/06/2016 - Everaldo Gomes - [email protected]
#
# 079 - Blocos estimulam uma filosofia "passe para a frente"
#
#
# Na programação estrutura e imperativa, estamos acostumados
# a invocar uma função, pegar o retorno da função e aplicar
# outro comando.
#
#
# Em Ruby, blocos (Procs) estimulam uma filosofia "passe para a frente".
#
#
# Você invoca um método, mesmo que ele retorne valores, costuma-se retornar
# os valores num bloco, que por sua vez podem ter outro bloco aplicado e
# assim por diante.
#
#
# Imagine uma linha de montagem de uma fábrica: sempre pra frente.
#
# O produto passa por uma esteira e a cada máquina que ele encontra é
# transformado um pouco, mas o fluxo é sempre em diante.
#
#
#
#
# Vamos listar os números de 1 a 1000 que são divisíveis por 2, 3, 4 e 5
# simultaneamente
puts (1..1000).select { |n| n.modulo(2).zero? }.
select { |n| n.modulo(3).zero? }.
select { |n| n.modulo(4).zero? }.
select { |n| n.modulo(5).zero? }
# ou
x = (1..1000).select do |n|
[2, 3, 4, 5].map do |div|
n.modulo(div).zero?
end.all?
end.to_a
puts x
#
# Tivemos que dividir em duas linhas por causa que não
# colocamos parênteses no puts e pela precedência de operadores
#
# Temos que usar {} para que funcione num único comando
#
#
puts (1..1000).select { |n|
[2, 3, 4, 5].map do |div|
n.modulo(div).zero?
end.all?
}