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"
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"
puts h.instance_variable_get(:@hello) # nil
h.instance_variable_set(:@hello, "StackOverflow") # <- set the value
puts h.instance_variable_get(:@hello) # StackOverflow
3条答案
按热度按时间vcirk6k61#
可以这样使用
instance_variable_get
:如果变量是undefined(在我的例子中第一次调用
instance_variable_get
),则得到nil
。正如安德鲁在他的评论中提到的:
您不应该将此作为访问示例变量的默认方式,因为它违反了封装。
更好的方法是定义一个访问器:
如果你想要另一个方法名,你可以 alias 访问器:
alias :my_hello :hello
。如果类不是在代码中定义的,而是在gem中定义的:您可以在代码中使用modify classes和insert new functions to classes。
gab6jxml2#
您也可以通过调用
attr_reader
或attr_accessor
来完成此操作,如下所示:或
调用
attr_reader
将为给定变量创建一个getter
:调用
attr_accessor
将为给定变量创建一个getter
和一个setter
:正如您可能理解的那样,相应地使用
attr_reader
和attr_accessor
。仅在需要getter
和setter
时使用attr_accessor
,仅在需要getter
时使用attr_reader
lnxxn5zx3#
如果任何人想要访问要设置的变量,这里他们可以这样做: