-
Notifications
You must be signed in to change notification settings - Fork 14
/
069_use_fetch_para_retornar_um_valor_default_quando_a_chave_nao_existir.rb
executable file
·93 lines (80 loc) · 2.42 KB
/
069_use_fetch_para_retornar_um_valor_default_quando_a_chave_nao_existir.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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# 09/06/2016 - Everaldo Gomes - [email protected]
#
# 069 - Use fetch para retornar um valor default quando a chave não existir
#
# http://ruby-doc.org/core-2.3.0/Hash.html#method-i-fetch
#
#
# Quando uma chave inexistente de uma hash é acessada, por padrão nil
# é retornado.
#
# Se no momento da construção da hash (método new) for passado um bloco,
# esse valor será avaliado. Mas, raramente essa opção é utilizada.
#
#
# O método fetch permite retornar um valor default, lançar a Exceção KeyError,
# se nenhum valor default for fornecido ou calcular dinamicamente com um bloco.
#
#
# Esse método é muito útil em métodos que recebem diversas opções como argumentos
#
#
def um_metodo_controverso(args = {})
hora = args[:hora]
end
def um_metodo_controverso2(args = {})
hora = args[:hora] || Time.now.usec
end
def um_metodo_controverso3(args = {})
hora = args.fetch :hora
end
def um_metodo_controverso4(args = {})
hora = args.fetch(:hora, Time.now.usec)
end
def um_metodo_controverso5(args = {})
hora = args.fetch(:hora) do |key|
Time.now.usec
end
end
puts "Tempo agora=#{Time.now.usec}"
puts um_metodo_controverso()
puts um_metodo_controverso2(hora: false)
begin
puts um_metodo_controverso3() # =>
rescue KeyError => e
puts "Key error foi lançado no exemplo 3"
end # => nil
puts um_metodo_controverso4()
puts um_metodo_controverso5()
# O primeiro método retorna nil, porque nenhum valor foi passado
#
# O segundo, que utiliza um or || funciona bem, porque foi passado
# o valor false. Mas é perigoso, porque se um valor como string vazia
# fosse passada, o segundo operando não seria avaliado. É uma técnica
# muito utilizada, mas relativamente insegura. Pois, às vezes, falso
# é um valor válido para o argumento, mas pode ser sobrescrito por outro
# através do or.
#
# O terceiro método, lança a exceção KeyError, que é capturada pela cláusula
# Rescue
#
# O quarto exemplo, utiliza o argumento default, passado como segundo parâmetro
#
# O quinto exemplo, retorna o valor default dinâmico, calculado no bloco.
#
#
# Note que todos os tempos estão em ordem crescente e são superiores à
# Tempo agora. Isso significa que os valores são avaliados somente
# no momento da chamada da função, não na definição.
#
# Na Linguagem Python, os valores são avaliados "eager" # =>
#
#
#
#
# >> Tempo agora=750944
# >>
# >> 750980
# >> Key error foi lançado no exemplo 3
# >> 751024
# >> 751029