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

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

[email protected]
personal http://paolodona.blogspot.com

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

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 :confused:
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
blog it: http://riffraff.blogsome.com
blog en: http://www.riffraff.info

  ___________________________________________________________

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

On Jan 24, 2008 6:37 PM, gabriele renzi [email protected] wrote:

(c|m)attr_*) ma è, credo, facile da definire:
require ‘mu’

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

M

2008/1/24 Paolo Donà [email protected]:

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

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

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. [email protected] wrote:

Foo.bar = 2 #=> 2
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


Paolo D.’
SeeSaw | Intuitive web stuff

[email protected]
personal http://paolodona.blogspot.com