093_voce_pode_abrir_uma_classe_e_adicionar_novos_metodos.rb 1.37 KB
Newer Older
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 94 95
# 10/06/2016 - Everaldo Gomes - everaldo.gomes@gmail.com
#
# 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