无法访问ruby中类外的实例变量

无法访问ruby中类外的实例变量,ruby,instance-variables,attr-accessor,Ruby,Instance Variables,Attr Accessor,在我的代码中,当尝试在类外打印p@stack时,它显示nil,尽管放置了attr\u访问器:stacks,:每个堆栈大小,:stack\u编号。与往常一样,它工作良好,在类内使用时显示数据。我错过了什么 class SetOfStacks attr_accessor :stacks, :each_stack_size, :stack_number # Initializing Hash to hold all the stacks and initial stack is created.

在我的代码中,当尝试在类外打印
p@stack
时,它显示
nil
,尽管放置了
attr\u访问器:stacks,:每个堆栈大小,:stack\u编号
。与往常一样,它工作良好,在类内使用时显示数据。我错过了什么

class SetOfStacks
 attr_accessor :stacks, :each_stack_size, :stack_number
 # Initializing Hash to hold all the stacks and initial stack is created.
 def initialize
  @stacks = Hash.new # declaring hash to hold all stacks
  @each_stack_size = 3 # defining each stack size
  @stack_number = 1 # Current stack number
  @stacks[@stack_number] = Array.new
 end
 ...
 ...

end 
@obj = SetOfStacks.new
@obj.push(4)
@obj.push(5)
@obj.push(6)
@obj.push(7)
@obj.pop
p @stacks

要打印实例变量,必须使用实例的上下文访问它

p @obj.stacks

要打印实例变量,必须使用实例的上下文访问它

p @obj.stacks
Getter和Setter方法 你误解了我的意思。本质上,它为实例变量创建getter和setter方法。在您的例子中,
attr\u accessor:stacks
创建SetOfStacks#stacksSetOfStacks=方法。请注意,这些仍然是对象的实例方法,而不是全局变量,因此您仍然需要正确地调用它们。例如:

@obj = SetOfStacks.new
@obj.stacks                # invoke your getter
@obj.stacks = { foo: nil } # invoke your setter
Getter和Setter方法 你误解了我的意思。本质上,它为实例变量创建getter和setter方法。在您的例子中,
attr\u accessor:stacks
创建SetOfStacks#stacksSetOfStacks=方法。请注意,这些仍然是对象的实例方法,而不是全局变量,因此您仍然需要正确地调用它们。例如:

@obj = SetOfStacks.new
@obj.stacks                # invoke your getter
@obj.stacks = { foo: nil } # invoke your setter

你知道实例变量是什么意思吗?在
initialize
方法中,你也可以执行
self.stacks=Hash.new
,因为
attr\u accessor
用于创建getter和setter方法。如果你只想引用实例变量(在类内部),你不需要使用
attr\u accessor
使用
@
相关问答:您知道实例变量的含义,是吗?在
初始化
方法中,你也可以做
self.stacks=Hash.new
,因为
attr\u accessor
是用来创建getter和setter方法的。如果你只是想用
@
引用你的实例变量(在你的类中),你不需要使用
attr\u accessor
。相关问答:你的答案会有用,但是你的解释是错误的。调用
@obj.stacks
调用@obj中的getter方法;看起来您只能直接访问实例变量。是的,您是正确的。我把我的答案简化了一点,以使人明白我的意思。当您设置attr_访问器时,您正在创建“getter”和“setter”方法,它们分别允许您读取和写入实例变量。例如,如果您只想允许对实例变量进行读取访问,则可以设置attr_reader。虽然这并不完全成立,因为我们可以覆盖它并调用对象上的实例变量集。你的答案会有效,但你的解释是错误的。调用
@obj.stacks
调用@obj中的getter方法;看起来您只能直接访问实例变量。是的,您是正确的。我把我的答案简化了一点,以使人明白我的意思。当您设置attr_访问器时,您正在创建“getter”和“setter”方法,它们分别允许您读取和写入实例变量。例如,如果您只想允许对实例变量进行读取访问,则可以设置attr_reader。尽管这并不完全成立,因为我们可以覆盖它并调用对象上的实例变量集。