# Variabili d'istanza delle classi... :-$

**URL:** <https://www.ruby-forum.com/t/variabili-distanza-delle-classi/127047>\
**Category:** IT\
**Created:** [January 24, 2008, 4:27pm UTC](https://www.ruby-forum.com/t/variabili-distanza-delle-classi/127047 "2008-01-24T16:27:10Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![paolodona](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/35a633/32.png) [@paolodona](https://www.ruby-forum.com/u/paolodona)\
**Post date:** [January 24, 2008, 4:27pm UTC](https://www.ruby-forum.com/t/variabili-distanza-delle-classi/127047/1 "2008-01-24T16:27:10Z")

</div>

Ciao carissimi,  
se

class Foo  
attr\_reader :bar  
end

corrisponde a:

class Foo  
def bar; @bar; end  
end

e…

class Foo  
cattr\_reader :bar  
end

corrisponde a:

class Foo  
def bar; @@bar; end  
def self.bar; @@bar; end  
end

conoscete se esiste qualche shortcut tipo _attr_ per ottenere qualcosa  
del  
genere?

class Foo  
def self.bar; @bar; end  
end

In pratica voglio generare una variabile di classe che non sia visibile  
nelle classi figlie (cosa che invece accade con le malefiche @@)  
il tutto per evitare sta bastardata:

> > class Foo; cattr\_accessor :bar; end  
> > class FooFighter \< Foo; end  
> > Foo.bar = 2 #=\> 2  
> > FooFighter.bar = 4 #=\> 4  
> > Foo.bar #=\> 4

## Paolo

Paolo D.’  
SeeSaw | Intuitive web stuff

> **[A Padova il buon software chi lo fa?](https://seesaw.it/)**
>
> A creare software sono tantissimi, a farlo molto bene c’è una certa schiera di sviluppatori, ma a costruirlo un pezzo alla volta insieme al cliente, plasmarlo sulle sue esigenze e renderlo parte di un nuovo approccio al mondo del lavoro sono davvero...

removed\_email\_address@domain.invalid  
personal [http://paolodona.blogspot.com](http://paolodona.blogspot.com)

---

<div class="post-metadata">

**Author:** ![paolodona](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/35a633/32.png) [@paolodona](https://www.ruby-forum.com/u/paolodona)\
**Post date:** [January 24, 2008, 6:23pm UTC](https://www.ruby-forum.com/t/variabili-distanza-delle-classi/127047/2 "2008-01-24T18:23:32Z")

</div>

Paolo D. wrote:

> In pratica voglio generare una variabile di classe che non sia visibile  
> nelle classi figlie (cosa che invece accade con le malefiche @@)  
> il tutto per evitare sta bastardata:
> 
> > > class Foo; cattr\_accessor :bar; end  
> > > class FooFighter \< Foo; end  
> > > Foo.bar = 2 #=\> 2  
> > > FooFighter.bar = 4 #=\> 4  
> > > Foo.bar #=\> 4

Ciao Paolo,

Prova a definire non una variabile di classe ma una variabile di istanza  
della eigenclass (metaclasse).

class Foo  
class \<\< self  
attr\_accessor :bar  
end

self.bar = “ecco il padre”  
end

class FooFighter \< Foo  
self.bar = “ecco il figlio”  
end

puts Foo.bar

# =\> ecco il padre

puts FooFighter.bar

# =\> ecco il figlio

Foo.bar = 2  
FooFighter.bar = 4  
puts Foo.bar

# =\> 2

puts FooFighter.bar

# =\> 4

---

<div class="post-metadata">

**Author:** ![paolodona](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/35a633/32.png) [@paolodona](https://www.ruby-forum.com/u/paolodona)\
**Post date:** [January 24, 2008, 6:37pm UTC](https://www.ruby-forum.com/t/variabili-distanza-delle-classi/127047/3 "2008-01-24T18:37:58Z")

</div>

> conoscete se esiste qualche shortcut tipo _attr_ per  
> ottenere qualcosa del  
> genere?

> class Foo  
> def self.bar; @bar; end  
> end

AFAIK non c’è builtin e non c’è neanche in rails (come  
(c|m)attr\_\*) ma è, credo, facile da definire:

job@ut:~$ cat t.rb  
class Module  
def iattr(what,\*names)  
# this introduces a new scope, no send there 😕  
slf = class \<\< self; self; end  
slf.send(“attr\_#{what}”,\*names)  
end  
end

require ‘mu’

t ‘compiles’ do  
Class.new do  
iattr :reader, :foo  
end  
end

t ‘adds a reader’ do  
c = Class.new do  
@foo=123  
iattr :reader, :foo  
end  
is c.foo, 123  
end

t ‘adds a writer’ do  
c = Class.new do  
@foo=123  
iattr :writer, :foo  
end  
is c.foo=(123), 123  
end

t ‘adds an accessor’ do  
c = Class.new do  
@foo=12  
iattr :accessor, :foo  
end  
is c.foo, 12  
c.foo= 123  
is c.foo, 123  
end

t ‘accessors do not overlap’ do  
c = Class.new do  
@foo=12  
iattr :accessor, :foo  
end  
d = Class.new(c)  
is c.foo, 12  
c.foo= 123  
is c.foo, 123

is d.foo,nil  
end

job@ut:~$ ruby t.rb  
Loaded suite t  
Started  
…  
Finished in 0.004134 seconds.

5 tests, 7 assertions, 0 failures, 0 errors

job@ut:~$ irb -r t.rb

> > class Foo  
> > iattr :accessor, :bar  
> > end  
> > =\> nil  
> > class FooFighter \< Foo  
> > end  
> > =\> nil  
> > Foo.bar = 2  
> > =\> 2  
> > FooFighter.bar = 4  
> > =\> 4  
> > Foo.bar  
> > =\> 2

HTH

–  
Goto 10: [http://www.goto10.it](http://www.goto10.it)  
blog it: [http://riffraff.blogsome.com](http://riffraff.blogsome.com)  
blog en: [http://www.riffraff.info](http://www.riffraff.info)

```
  ___________________________________________________________

```

Yahoo! Answers - Got a question? Someone out there knows the answer. Try  
it  
now.

> **[Yahoo | Mail, Weather, Search, Politics, News, Finance, Sports & Videos](https://www.yahoo.com/)**
>
> Latest news coverage, email, free stock quotes, live scores and video are just the beginning. Discover more every day at Yahoo!

---

<div class="post-metadata">

**Author:** ![paolodona](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/35a633/32.png) [@paolodona](https://www.ruby-forum.com/u/paolodona)\
**Post date:** [January 25, 2008, 7:46am UTC](https://www.ruby-forum.com/t/variabili-distanza-delle-classi/127047/4 "2008-01-25T07:46:37Z")

</div>

On Jan 24, 2008 6:37 PM, gabriele renzi [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> (c|m)attr\_\*) ma è, credo, facile da definire:  
> require ‘mu’

Cool; ma che cos’è “mu”? Qualcosa di uscito da “Godel, Escher, Bach”?

M

---

<div class="post-metadata">

**Author:** ![paolodona](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/35a633/32.png) [@paolodona](https://www.ruby-forum.com/u/paolodona)\
**Post date:** [January 25, 2008, 7:48am UTC](https://www.ruby-forum.com/t/variabili-distanza-delle-classi/127047/5 "2008-01-25T07:48:23Z")

</div>

2008/1/24 Paolo Donà [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> …

> il tutto per evitare sta bastardata:
> 
> > > class Foo; cattr\_accessor :bar; end  
> > > class FooFighter \< Foo; end  
> > > Foo.bar = 2 #=\> 2  
> > > FooFighter.bar = 4 #=\> 4  
> > > Foo.bar #=\> 4

Perché ti serve una cosa del genere? E usare invece una hash globale che  
mappa la classe sul valore desiderato?

M

---

<div class="post-metadata">

**Author:** ![paolodona](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/35a633/32.png) [@paolodona](https://www.ruby-forum.com/u/paolodona)\
**Post date:** [January 25, 2008, 10:11am UTC](https://www.ruby-forum.com/t/variabili-distanza-delle-classi/127047/6 "2008-01-25T10:11:58Z")

</div>

Mi serve perchè è la cosa che si avvicina di più al concetto di “variabile  
di classe o statica” presente in altri linguaggi… con tutti gli  
utilizzi  
tipici che ne conseguono. La soluzione delle hash è percorribile, ma la  
trovo scomoda… mi sembra un workaround per un concetto che è di più basso  
livello. Girando ho trovato anche questo articolo che spiega in maniera  
molto semplice il problema:  
[http://railstips.org/2006/11/18/class-and-instance-variables-in-ruby](http://railstips.org/2006/11/18/class-and-instance-variables-in-ruby)

Alla fine il modo + semplice per ottenere quello che voglio credo sia  
questo:

class Foo  
class \<\< self; attr\_accessor :bar end  
end

Magari wrappato come ha fatto Renzi per addolcire la sintassi.  
Paolo

On Jan 25, 2008 7:47 AM, Matteo V. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > > > Foo.bar = 2 #=\> 2  
> > > > removed\_email\_address@domain.invalid  
> > > > [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

–  
Paolo D.’  
SeeSaw | Intuitive web stuff

> **[A Padova il buon software chi lo fa?](https://seesaw.it/)**
>
> A creare software sono tantissimi, a farlo molto bene c’è una certa schiera di sviluppatori, ma a costruirlo un pezzo alla volta insieme al cliente, plasmarlo sulle sue esigenze e renderlo parte di un nuovo approccio al mondo del lavoro sono davvero...

removed\_email\_address@domain.invalid  
personal [http://paolodona.blogspot.com](http://paolodona.blogspot.com)
