end
Domanda tanto innocente quanto tosta.
Sono equivalenti. Spiegare perché è un po’ meno banale.
Extend prende i metodi d’istanza del parametro e li aggiunge al
ricevente. Ipotizzando che “b” abbia i metodi d’istanza “foo_b” e
“bar_b”, quando scrivi:
a.extend(b)
Quel che succede
è:
def a.foo_b(…)
…
end
def a.bar_b(...)
...
end
“a” può tranquillamente essere una classe e “b” un modulo, quindi
scrivendo:
AAA.extend(CCC)
Succede:
def AAA.ccc_method_1(...)
...
end
def AAA.ccc_method_2(...)
...
end
Invece di scrivere “AAA.extend(CCC)” si può scrivere come sopra:
class AAA
extend CCC
end
Perché il ricevente implicito di extend è self:
class AAA
self.extend CCC
end
…che all’interno di “class AAA … end” è AAA, appunto:
class AAA
AAA.extend(CCC)
end
Uguale a quanto visto all’inizio.
Riguardo al secondo caso (“include”), bisogna tenere a mente è che
ogni oggetto ha una sua classe “personale” (singleton) oltre quella
“ufficiale”, che permette di fare questo:
a = Object.new
def a.say_hello
puts "hello, world!"
end
Qua il metodo “say_hello” viene aggiunto solo alla classe singleton di
“a”, non all’intera classe Object, per cui creando una nuova istanza
di Object questa non avrà il metodo “say_hello”.
Altro modo equivalente di aggiungere roba nella classe singleton di
“a” sarebbe:
class << a
def say_bye
puts "goodbye, world!"
end
end
Ovvero “<<” permette di operare nel costesto di una classe singleton.
Ora, nell’esempio che ha dato vita a questo delirio ;-), scrivevamo:
class AAA
def aaa_method(...)
...
end
end
Questo è più o meno zucchero sintattico per:
AAA = Class.new
def AAA.aaa_method(...)
...
end
Ricorda niente?
Come dicevo, altro modo di scriverlo sarebbe:
AAA = Class.new
class << AAA
def aaa_method(...)
...
end
end
Ora, una chiamata a “include” di questo tipo:
class << AAA
include CCC
end
Espande in questo:
class << AAA
def ccc_method_1(...)
...
end
def ccc_method_2(...)
...
end
end
Per cui dovrebbe essere facile, se non ti ho ancora causato sonno
profondo, vedere perché i metodi di CCC finiscono con l’essere metodi
di classe (sostanzialmente metodi d’istanza del singleton) di AAA.
Massimiliano
–
blog: http://blog.hyperstruct.net
sw: http://dev.hyperstruct.net, http://repo.hyperstruct.net
–
blog: http://blog.hyperstruct.net
sw: http://dev.hyperstruct.net, http://repo.hyperstruct.net