If an instance variable belongs to a class, can I access the instance variable (e.g. @hello
) directly using the class instance?
class Hello def method1 @hello = "pavan" end end h = Hello.new puts h.method1
The public instance variables are visible outside the class, and they can be accessed through a reference to the object to which they belong, by means of the field selection operator ``.
Instance variables can be accessed directly by calling the variable name inside the class. However, within static methods (when instance variables are given accessibility), they should be called using the fully qualified name. ObjectReference. VariableName.
The instance variables of an object can only be accessed by the instance methods of that object. The ruby instance variables do not need a declaration. This implies a flexible object structure. Every instance variable is dynamically appended to an object when it is first referenced.
Class methods can access class variables and class methods directly. Class methods cannot access instance variables or instance methods directly—they must use an object reference. Also, class methods cannot use the this keyword as there is no instance for this to refer to.
Yes, you can use instance_variable_get
like this:
class Hello def method1 @hello = "pavan" end end h = Hello.new p h.instance_variable_get(:@hello) #nil p h.method1 #"pavan" - initialization of @hello p h.instance_variable_get(:@hello) #"pavan"
If the variable is undefined (first call of instance_variable_get
in my example) you get nil
.
As Andrew mention in his comment:
You should not make this the default way you access instance variables as it violates encapsulation.
A better way is to define an accessor:
class Hello def method1 @hello = "pavan" end attr_reader :hello end h = Hello.new p h.hello #nil p h.method1 #"pavan" - initialization of @hello p h.hello #"pavan"
If you want another method name, you could alias the accessor: alias :my_hello :hello
.
And if the class is not defined in your code, but in a gem: You can modify classes in your code and insert new functions to classes.
You can also accomplish this by calling attr_reader
or attr_accessor
like this:
class Hello attr_reader :hello def initialize @hello = "pavan" end end
or
class Hello attr_accessor :hello def initialize @hello = "pavan" end end
Calling attr_reader
will create a getter
for the given variable:
h = Hello.new p h.hello #"pavan"
Calling attr_accessor
will create a getter
AND a setter
for the given variable:
h = Hello.new p h.hello #"pavan" h.hello = "John" p h.hello #"John"
As you might understand, use attr_reader
and attr_accessor
accordingly. Only use attr_accessor
when you need a getter
AND a setter
and use attr_reader
when you only need a getter
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With