如果一个实例变量属于一个类,我可以直接使用类实例来访问该实例变量(例如@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
来给访问器取另外一个名字。你也可以通过这样调用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
和一个 setter
:
h = Hello.new
p h.hello #"pavan"
h.hello = "John"
p h.hello #"John"
如您所知,应相应地使用attr_reader
和attr_accessor
。仅在需要getter
和setter
时使用attr_accessor
,而在仅需要getter
时,请使用attr_reader
。
如果有人想要访问并设置这个变量,以下是他们可以做到的:
puts h.instance_variable_get(:@hello) # nil
h.instance_variable_set(:@hello, "StackOverflow") # <- set the value
puts h.instance_variable_get(:@hello) # StackOverflow
h = Hello.new
和h.method1
和h.hello
? - nik7attr_reader :hello
定义一个访问器。 - knutalias my_hello hello
,而不是alias :my_hello :hello
吗? - anon