Escolar Documentos
Profissional Documentos
Cultura Documentos
A visão é que, muito antes dos anos 70 terminarem, devemos ser capazes
de desenhar e implementar os tipos de sistemas que agora estão
forçando nossa habilidades de programação, ao custo de somente uma
pequena porcentagem de homens-anos que nos custam agora, e que
além disso, esses sistemas serão virtualmente livre de bugs. Essas duas
melhorias andam de mãos dadas. Nessa última questão software parece
ser diferente de muitos outros produtos, onde como regra uma alta
qualidade implica em alto preço. Aqueles que quiserem software
confiável descobrirão que devem encontrar meios de evitar a maioria dos
bugs para começo de conversa, e como resultado o processo de
programação se tornará mais barato. Se quiser programadores mais
efetivos, descobrirão que eles não devem desperdiçar tempo debugando,
eles não devem introduzir bugs para começo de conversa. Em outras
palavras: ambas os objetivos apontam para a mesma mudança.
[Tradução] Metaprogramação
em Ruby: é tudo sobre Self
16 Novembro 2009, 14:56 h
1 class Person
2 def self.species
3 "Homo Sapien"
4 end
5 end
6
class Person
7
class << self
8
def species
9
"Homo Sapien"
10
end
11
end
12
end
13
14
class << Person
15
def species
16
"Homo Sapien"
17
end
18
end
19
20
Person.instance_eval
21
do
22
def species
23
"Homo Sapien"
24
end
25
end
26
27
def Person.species
28
"Homo Sapien"
29
end
1
2 class Person
3 def name
4 "Matz"
5 end
6 end
7
8 Person.class_eval do
9 def name
1 "Matz"
0 end
1 end
1
Todos esses trechos definem um método chamado name na
classe Person. Então Person.new retornará “Matz”. Para
aqueles familiarizados com Ruby, isso não é novidade.
Quando se aprende sobre metaprogramação, cada um
desses trechos é apresentado de forma isolada: outro
mecanismo para colocar métodos onde eles “pertencem”.
Na verdade, entretanto, existe uma única explicação
unificada de porque todos esses trechos de cóigo
funcionam da forma como funcionam.
class Person
1
end
2
3
Person.class #=> Class
4
5
class Class
6
def loud_name
7
"#{name.upcase}!"
8
end
9
end
10
11
Person.loud_name #=>
12
"PERSON!"
1 matz = Object.new
2 def matz.speak
"Place your burden to machine's
3
shoulders"
4
end
matz = Object.new
1
def matz.speak
2
"Place your burden to machine's
3
shoulders"
4
end
5
6
matz.class #=> Object
1 class Person
2 def name
3 "Matz"
end
4
5
self.name #=>
6
"Person"
7
end
Person.class_eval do
1
def name
2
"Matz"
3
end
4
5
self.name #=>
6
"Person"
7
end
def Person.species
1
"Homo Sapien"
2
end
3
4
Person.name #=>
5
"Person"
1 class Person
2 class << self
3 def species
4 "Homo Sapien"
5 end
6
7 self.name #=> ""
8 end
9 end
Person.instance_eval do
1
def species
2
"Homo Sapien"
3
end
4
5
self.name #=>
6
"Person"
7
end