Forum: Italian Ruby user group Fwd: Iniettare metodi statici

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
30cb10b258fc90a05e97d63380133bf0?d=identicon&s=25 Massimiliano Mirra (Guest)
on 2006-04-05 11:13
(Received via mailing list)
> 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
B1c45f949749d001b4b9a75f50f69d38?d=identicon&s=25 Paolo Donà (Guest)
on 2006-04-05 11:29
(Received via mailing list)
Moooolto esaustivo davvero! Grazie 10 ** 3

On 4/5/06, Massimiliano Mirra <i81rnqg02@sneakemail.com> 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
> Ml@lists.ruby-it.org
> http://lists.ruby-it.org/mailman/listinfo/ml
>



--
Paolo Donà
email me: paolo[dot]dona[at]gmail[dot]com
skype me: paolo[dot]dona
This topic is locked and can not be replied to.