G
Gioele Barabucci
How can I create methods like "attr:" that can create methods and instance
variables?
I'd like to do this
class B < A
my_property :k, "K"
def test
p @k # should print "K"
p @@my_properties # should print ['k']
end
end
I tried with this (non-) solution
class A
def A.my_property(sym, val)
self.instance_eval {
@@my_properties ||= Array.new()
@@my_properties << sym.to_s
eval "@#{sym.id2name} = \"#{val}\""
# p @k1 # << this shows "K1.B" or "K1.C" as expected
}
end
end
but these tests showed me that I was wrong
class A
def test
p @@my_properties
end
end
class B < A
my_property :k1, "K1.B" # k1 is a string fixed to "K1"
my_property :k2, "K2.B"
def test
super # should be ['k1', 'k2']
p @k1 # should be "K1"
end
end
class C < A
my_property :k1, "K1.C"
def test
super # should be ['k1']
p @k1 # should be "K1.C"
end
end
A.new.test (should print nil or a warning) => ["k1", "k2", "k1"]
B.new.test (should print ['k1', 'k2'] 'K1.B') => ["k1", "k2", "k1"]
/at.rb:28: warning: instance variable @k1 not initialized
nil
A.new.test (should print nil or a warning) => ["k1", "k2", "k1"]
C.new.test (should print ['k1'] 'K1.C') => ["k1", "k2", "k1"]
/at.rb:36: warning: instance variable @k1 not initialized
nil
Any suggestion or idea?
variables?
I'd like to do this
class B < A
my_property :k, "K"
def test
p @k # should print "K"
p @@my_properties # should print ['k']
end
end
I tried with this (non-) solution
class A
def A.my_property(sym, val)
self.instance_eval {
@@my_properties ||= Array.new()
@@my_properties << sym.to_s
eval "@#{sym.id2name} = \"#{val}\""
# p @k1 # << this shows "K1.B" or "K1.C" as expected
}
end
end
but these tests showed me that I was wrong
class A
def test
p @@my_properties
end
end
class B < A
my_property :k1, "K1.B" # k1 is a string fixed to "K1"
my_property :k2, "K2.B"
def test
super # should be ['k1', 'k2']
p @k1 # should be "K1"
end
end
class C < A
my_property :k1, "K1.C"
def test
super # should be ['k1']
p @k1 # should be "K1.C"
end
end
A.new.test (should print nil or a warning) => ["k1", "k2", "k1"]
B.new.test (should print ['k1', 'k2'] 'K1.B') => ["k1", "k2", "k1"]
/at.rb:28: warning: instance variable @k1 not initialized
nil
A.new.test (should print nil or a warning) => ["k1", "k2", "k1"]
C.new.test (should print ['k1'] 'K1.C') => ["k1", "k2", "k1"]
/at.rb:36: warning: instance variable @k1 not initialized
nil
Any suggestion or idea?