Ruby attr_访问器包装返回nil。

Ruby attr_访问器包装返回nil。,ruby,transpose,attr-accessor,Ruby,Transpose,Attr Accessor,我有一个简单的类,正在转换一个二维数组,如下所示: class Group attr_accessor :group_array def initialize @group_array = [] end ... def shuffle_groups! new_groups = group_array.transpose group_array = new_groups end end 但是,当我尝试在一行中设置新的组数组时,如下所示: de

我有一个简单的类,正在转换一个二维数组,如下所示:

class Group
  attr_accessor :group_array
  def initialize
    @group_array = []
  end

  ...

  def shuffle_groups!
    new_groups = group_array.transpose
    group_array = new_groups
  end

end
但是,当我尝试在一行中设置新的组数组时,如下所示:

def shuffle_groups!
    group_array = group_array.transpose
end
我得到:

undefined method `transpose' for nil:NilClass

为什么这不起作用

请向解释器说明您正在调用访问器方法,而不是创建局部变量

class Group

  attr_accessor :group_array

  def initialize
    @group_array = [%w(1 2 3), %w(4 5 6)]
  end

  def shuffle_groups!
    new_groups = self.group_array.transpose
    self.group_array = new_groups
  end

  def shuffle_groups_2!
    self.group_array = self.group_array.transpose
  end

end

g = Group.new
p g.group_array
# [["1", "2", "3"], ["4", "5", "6"]]
g.shuffle_groups!
p g.group_array
# [["1", "4"], ["2", "5"], ["3", "6"]]
g.shuffle_groups_2!
p g.group_array
# [["1", "2", "3"], ["4", "5", "6"]]

这两种方法都可以很好地工作。

让我了解一下-您在第一个实现中运行相同的代码(它通过了),在第二个实现中运行相同的代码(失败了)?是的,当我设置局部变量时,它可以工作,但当我尝试将group\U array设置为group\U array时,它不能工作。这没有多大意义,因为在这两种方法中运行的第一件事是
group\u array.transpose
。。。您能否在每次实现之前添加
puts group_array
?是的,当我输出变量时,我会看到它(例如,包含我期望的对象的2D数组)。但是仍然为nil获取未定义的方法转置:nilclass同样,我应该注意,当我执行
group\u array=@group\u array.transpose
时,它是有效的。你为什么要引用self而不是仅仅使用实例变量
@group\u array
?我总是使用实例变量。不过,我不是来这里口述风格的。:)啊哈!知道了。谢谢。我通常使用
@group\u数组。我认为这与局部变量混淆有关。