【问题标题】:Unable to access instance variable outside the class in ruby无法在 ruby​​ 中访问类外部的实例变量
【发布时间】:2014-12-03 22:46:39
【问题描述】:

在我的代码中尝试在课堂外打印p @stack 时,尽管放置了attr_accessor :stacks, :each_stack_size, :stack_number,但它显示nil。像往常一样,它工作正常,并在类内使用时显示数据。我错过了什么?

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

【问题讨论】:

  • 你知道instance变量是什么意思吗?
  • 在您的initialize 方法中,您也可以使用self.stacks = Hash.new,因为attr_accessor 用于创建getter 和setter 方法。
  • 如果你只是想用@引用你的实例变量(在你的类中),你不需要使用attr_accessor

标签: ruby instance-variables attr-accessor


【解决方案1】:

为了打印实例变量,您必须使用实例的上下文访问它。​​

p @obj.stacks

【讨论】:

  • 您的答案会起作用,但您的解释不正确。调用@obj.stacks 调用@obj 中的getter 方法;它只是看起来您可以直接访问实例变量。
  • 是的,你是对的。我稍微简化了我的答案以理解这一点。当您设置 attr_accessor 时,您正在创建“getter”和“setter”方法,它们分别允许您读取和写入实例变量。例如,如果您只想允许对实例变量进行读取访问,则可以设置 attr_reader。尽管这并不完全成立,因为我们可以覆盖它并在对象上调用 instance_variable_set。
【解决方案2】:

Getter 和 Setter 方法

您误解了Module#attr_accessor 的作用。本质上,它为您的实例变量创建 getter 和 setter 方法。在您的情况下,attr_accessor :stacks 创建了 SetOfStacks#stacksSetofStacks#= 方法。请注意,这些仍然是对象的实例方法,而不是全局变量,因此您仍然必须正确调用它们。例如:

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

【讨论】:

    猜你喜欢
    • 2012-08-20
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多