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