从类外部访问实例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_readerattr_accessor 。 当你需要一个getter和一个setter时候只使用attr_reader当你只需要一个getter时使用attr_reader