如果一个实例变量属于一个类,我可以@hello
直接使用类实例访问实例变量(例如)吗?
class Hello
def method1
@hello = "pavan"
end
end
h = Hello.new
puts h.method1
如果一个实例变量属于一个类,我可以@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"
如果变量未定义(instance_variable_get
在我的示例中是第一次调用),您将得到nil
.
正如安德鲁在他的评论中提到的:
您不应将此作为访问实例变量的默认方式,因为它违反了封装。
更好的方法是定义一个访问器:
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 中:您可以修改代码中的类并将新函数插入到 classes。
您也可以通过调用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
创建一个:getter
h = Hello.new
p h.hello #"pavan"
调用将为给定变量attr_accessor
创建一个getter
AND a :setter
h = Hello.new
p h.hello #"pavan"
h.hello = "John"
p h.hello #"John"
正如您可能理解的那样,使用attr_reader
并attr_accessor
相应地使用。仅attr_accessor
在需要getter
AND a时setter
使用attr_reader
,仅在需要 a 时使用getter