Heey I am new to Ruby. I need to create a factory method, which will return me an object of a class. Using that object I should be able to access the variables of the class. I have written the following code, but I surely have miss something.
class Super
@@super_temp = 1
def Super.get_instance(world)
platform = world
if @@instance == nil
if platform==1
@@instance = BaseA.new
else
@@instance = BaseB.new
end
end
return @@instance
end
end
class BaseA < Super
@@base_temp = 2
end
class BaseB < Super
@@base_temp = 3
end
class Demo
def Demo.call_demo
obj = Super.get_instance(0)
puts "---------temp is #{obj.base_temp}"
end
end
Demo.call_demo
I need to retrieve the value of base_temp in class Demo.
Don't use @@
(Why should we avoid using class variables @@ in rails?) - @
solves your problem just as easily.
Aside from that, all that is missing in your code is a getter:
class Super
@super_temp = 1
def Super.get_instance(world)
platform = world
if @instance == nil
if platform==1
@instance = BaseA.new
else
@instance = BaseB.new
end
end
return @instance
end
def base_temp
self.class.base_temp
end
def self.base_temp
@base_temp
end
end
class BaseA < Super
@base_temp = 2
end
class BaseB < Super
@base_temp = 3
end
class Demo
def Demo.call_demo
obj = Super.get_instance(0)
puts "---------temp is #{obj.base_temp}"
end
end
Demo.call_demo
# ---------temp is 3
The instance getter (implemented as self.class.base_temp
) calls the class method base_temp
of the instance's class. If we add prints of the internal products of the function, you can have some insights about its internals:
class Super
def base_temp
p self
p self.class
p self.class.base_temp
end
end
BaseA.new.base_temp
# #<BaseA:0x000000027df9e0>
# BaseA
# 2
BaseB.new.base_temp
# #<BaseB:0x000000027e38b0>
# BaseB
# 3