# Fwd: Iniettare metodi statici

**URL:** <https://www.ruby-forum.com/t/fwd-iniettare-metodi-statici/93635>\
**Category:** IT\
**Created:** [April 5, 2006, 11:13am UTC](https://www.ruby-forum.com/t/fwd-iniettare-metodi-statici/93635 "2006-04-05T11:13:56Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Massimiliano\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/839c29/32.png) [@Massimiliano\_M](https://www.ruby-forum.com/u/Massimiliano_M)\
**Post date:** [April 5, 2006, 11:13am UTC](https://www.ruby-forum.com/t/fwd-iniettare-metodi-statici/93635/1 "2006-04-05T11:13:56Z")

</div>

> 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](http://blog.hyperstruct.net)  
sw: [http://dev.hyperstruct.net](http://dev.hyperstruct.net), [http://repo.hyperstruct.net](http://repo.hyperstruct.net)

–  
blog: [http://blog.hyperstruct.net](http://blog.hyperstruct.net)  
sw: [http://dev.hyperstruct.net](http://dev.hyperstruct.net), [http://repo.hyperstruct.net](http://repo.hyperstruct.net)

---

<div class="post-metadata">

**Author:** ![Massimiliano\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/839c29/32.png) [@Massimiliano\_M](https://www.ruby-forum.com/u/Massimiliano_M)\
**Post date:** [April 5, 2006, 11:29am UTC](https://www.ruby-forum.com/t/fwd-iniettare-metodi-statici/93635/2 "2006-04-05T11:29:17Z")

</div>

Moooolto esaustivo davvero! Grazie 10 \*\* 3

On 4/5/06, Massimiliano M. [removed\_email\_address@domain.invalid](mailto: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](http://blog.hyperstruct.net)  
> sw: [http://dev.hyperstruct.net](http://dev.hyperstruct.net), [http://repo.hyperstruct.net](http://repo.hyperstruct.net)
> 
> * * *
> 
> Ml mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

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