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
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
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
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