Fwd: Iniettare metodi statici


#1

end
Domanda tanto innocente quanto tosta. :wink:

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? :wink:

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


#2

Moooolto esaustivo davvero! Grazie 10 ** 3

On 4/5/06, Massimiliano M. removed_email_address@domain.invalid wrote:

end
a.extend(b)
“a” può tranquillamente essere una classe e “b” un modulo, quindi
def AAA.ccc_method_2(…)

Uguale a quanto visto all’inizio.
end
puts “goodbye, world!”

end
  def ccc_method_1(...)

di classe (sostanzialmente metodi d’istanza del singleton) di AAA.


blog: http://blog.hyperstruct.net
sw: http://dev.hyperstruct.net, http://repo.hyperstruct.net


Ml mailing list
removed_email_address@domain.invalid
http://lists.ruby-it.org/mailman/listinfo/ml


Paolo Donà
email me: paolo[dot]dona[at]gmail[dot]com
skype me: paolo[dot]dona