从类外部访问实例variables
如果一个实例variables属于一个类,我可以直接使用类实例访问实例variables(例如@hello
)吗?
class Hello def method1 @hello = "pavan" end end h = Hello.new puts h.method1
是的,你可以像这样使用instance_variable_get
:
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"
如果variables未定义(在我的例子中第一次调用instance_variable_get
),你会得到nil
。
正如安德鲁在他的评论中提到的
您不应该将其作为违反封装的实例variables访问的默认方式。
更好的方法是定义一个访问者:
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"
如果你想要另一个方法名,你可以使用别名 : alias :my_hello :hello
。
如果这个类没有在你的代码中定义,而是在一个gem中:你可以修改你的代码中的类并向类中插入新的函数 。
你也可以通过调用attr_reader
或者attr_accessor
来完成这个工作:
class Hello attr_reader :hello def initialize @hello = "pavan" end end
要么
class Hello attr_accessor :hello def initialize @hello = "pavan" end end
调用attr_reader
将为给定的variables创build一个getter
:
h = Hello.new p h.hello #"pavan"
调用attr_accessor
将为给定的variables创build一个getter
和一个setter
:
h = Hello.new p h.hello #"pavan" h.hello = "John" p h.hello #"John"
如你所知,相应地使用attr_reader
和attr_accessor
。 当你需要一个getter
和一个setter
时候只使用attr_reader
当你只需要一个getter
时使用attr_reader