【问题标题】:Objects inside of transposed array don't reflect changes转置数组内的对象不反映更改
【发布时间】:2018-11-07 13:50:11
【问题描述】:

我正在为“连接四”创建一个Grid 类:我从Square 对象创建字符串数组,然后通过在字符串数组上调用transpose 方法创建列数组:

class Grid
  Square = Struct.new(:state)

  def initialize
    @grid_strings = Array.new(6) { Array.new(7) {Square.new} }
    @grid_columns = @grid_strings.transpose
  end

我有一个方法可以通过更改正确的Square 实例的state 属性将符号放在所选列的末尾:

  def put_to_column(column_index, symbol)
    column = @grid_columns[column_index - 1]
    loop do
      square = column.pop
      raise "Full column" if square.nil?
      if square.state.nil?
        square.state = symbol
        break
      end
    end
  end

问题是:当我多次调用put_to_column 时,它会正确更改square 对象,但仅在@grid_strings 数组中。如果我检查@grid_columns 数组,所有square 对象仍将state 属性分配给nil。 找不到出错的地方,希望大家帮忙。

【问题讨论】:

    标签: arrays ruby


    【解决方案1】:

    找不到出错的地方,希望大家帮忙

    在这里

      square = column.pop
    

    您正在删除列中的单元格。仔细看,你会看到受影响的列变小了。此外,被删除的单元格是被修改的单元格,这就是为什么您永远看不到列数组中的更改的原因。

    【讨论】:

    • 但是column 变量只是我原始列的副本,不是吗?
    • @AnikeevGennadiy 不,不是。它是同一个数组对象的不同引用。如果它确实是一个完整的副本,那么您为什么会期望更改会反映在另一个数组的元素中是不清楚的。
    【解决方案2】:

    问题出在这里:

    @grid_columns = @grid_strings.transpose
    

    @grid_columns@grid_strings不同的对象。改变一个不会改变另一个。

    一种可能的替代方法是将grid_columns 定义为一个方法,它引用同一个对象:

    def grid_columns
      @grid_strings.transpose
    end
    

    您还可以使用其他方法,但在不知道您实际使用grid_columns 的情况下,很难提供进一步的建议。

    【讨论】:

    • 这不是问题。数组是不同的,是的,但它们指向所有相同的方格。
    • @SergioTulentsev ...但是这里的方块没有被改变。数组本身正在发生变异。
    • “数组本身正在发生变异” - 是,但这是错误。目的是改变方块。或者我就是这么读的。
    • “但是这里的方块没有被改变” - 但它们是 :) 这就是整个问题关于的内容。
    猜你喜欢
    • 2018-04-09
    • 2016-03-31
    • 2013-08-19
    • 2014-11-26
    • 2020-05-24
    • 2019-07-16
    • 2020-08-15
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多