forked from everaldo/ruby-em-100-exemplos
-
Notifications
You must be signed in to change notification settings - Fork 0
/
093_voce_pode_abrir_uma_classe_e_adicionar_novos_metodos.rb
95 lines (65 loc) · 1.37 KB
/
093_voce_pode_abrir_uma_classe_e_adicionar_novos_metodos.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
# 10/06/2016 - Everaldo Gomes - [email protected]
#
# 093 - Você pode abrir uma classe e adicionar novos métodos
#
#
# Esta técnica é conhecida como Monkey Patching.
#
# Pode ser muito útil, mas também perigosa porque o novo método
# criado pode "vazar" para outros contextos, modificando o comportamento
# de outros objetos de forma inesperada.
#
# A partir do Ruby 2.1, uma nova técnica foi introduzida, chamada
# Refinements, que permite limitar o escopo dos novos métodos
#
# http://ruby-doc.org/core-2.1.1/doc/syntax/refinements_rdoc.html
#
#
#
# Vamos fazer algumas traquinagens
class Fixnum
def sentido_da_vida?
self == 42
end
end
#
# Abrimos a classe Fixnum, padrão do Ruby, e adicionamos um novo
# método sentido_da_vida? disponível para todos os objetos da classe
#
puts 42.sentido_da_vida?
puts 10.sentido_da_vida?
#
#
# Vamos estragar um método já existente
#
#
puts "Alô mundo".upcase
class String
def upcase
"VOCÊ FOI HACKEADO"
end
end
puts "Alô mundo".upcase
#
#
# Nem tudo precisa ser traquinagem.
# Às vezes, voce só quer definir os métodos aos poucos
#
#
class Preguicosa
def metodo_a
puts "metodo a"
end
end
class Preguicosa
def metodo_b
puts "metodo b"
end
end
class Preguicosa
def metodo_a
"resolvi sobrescrever a"
end
end
puts Preguicosa.new.metodo_a
puts Preguicosa.new.metodo_b