在Ruby中更改实例变量数组中的对象变量

时间:2013-09-12 21:55:44

标签: ruby

如何处理整数数组@test_array,为数组的每个元素创建一个包含类@cells实例的新数组Cell,并设置{的值{1}}元素到新创建的对象的实例变量@test_array中?

之后,我希望能够更改不同对象的@value,并且在程序结束时,我想输出所有对象@value的数组。 / p>

@value

这是我在运行代码后得到的答案之一:

class Cells

  attr_accessor :value

  def initialize(value)
    @value = value
  end

end

class Grid

  attr_accessor :test_array, :cells

  def initialize
    @test_array = [1, 2, 3, 4]
    @cells = []
    @test_array.each { |value| @cells << Cell.new(value) }
  end

  def put_values_of_objects_to_array
    @cells.value_to_a ????????
  end

end

2 个答案:

答案 0 :(得分:0)

class Cell
  attr_accessor :values

  @arrs = []    #Creates a "class instance variable"

  class <<self  #Creates an accessor for the "class instance variable"
    attr_reader :arrs
  end

  def initialize(values)
    @values = values
    self.class.arrs << @values    #Add the @values array to the "class instance variable"
  end
end

test_array = [1, 2, 3]

@cells = test_array.map do |num|   #Create the cells
  Cell.new(test_array.dup)
end

p @cells   

--output:--
[#<Cell:0x0000010085ffd8 @values=[1, 2, 3]>, #<Cell:0x0000010085ff88 @values=[1, 2, 3]>, #<Cell:0x0000010085ff60 @values=[1, 2, 3]>]


@cells.each_with_index do |cell, i|   #Change the last value of each cell's @values array
  cell.values[-1] = i
end


p Cell.arrs   #Show all the @values arrays of all the cells:

--output:--
[[1, 2, 3, 0], [1, 2, 3, 1], [1, 2, 3, 2]]

现在您已将Grid类添加到帖子中,您可以将类实例变量添加到Grid类 - 而不是Cell类 - 以跟踪数组。

class Grid
  attr_accessor :cells

  TEST_ARRAY = [1, 2, 3, 4]

  @arrs = []
  class <<self
    attr_reader :arrs
  end

  def initialize 
    @cells = []

    TEST_ARRAY.each do |value| 
      new_cell = Cell.new(TEST_ARRAY.dup) 
      @cells << new_cell
      self.class.arrs << new_cell.values
    end

  end

end
  嘿,谢谢你,但是我想要的是一个元素   test_array进入对象,而不是整个数组。

这不是这个意思:

  

...将@test_array元素的值放入实例变量@value

class Cell
  attr_accessor :values

  def initialize(value)
    @values = [value]
  end
end

class Grid
  attr_accessor :cells

  TEST_ARRAY = [1, 2, 3, 4]

  @cell_values = []
  class <<self
    attr_reader :cell_values
  end

  def initialize 
    @cells = []

    TEST_ARRAY.each_with_index do |value, i| 
      new_cell = Cell.new(TEST_ARRAY[i]) 
      @cells << new_cell
      self.class.cell_values << new_cell.values
    end

  end

end

mygrid = Grid.new
p Grid.cell_values

mygrid.cells.each do |cell|
  cell.values << 5
end

p Grid.cell_values


--output:--
[[1], [2], [3], [4]]
[[1, 5], [2, 5], [3, 5], [4, 5]]

答案 1 :(得分:0)

这是一项非常有用的练习,你非常接近。声明一个数组(@cells = [])然后循环遍历另一个数组以对每个元素执行某些操作并将结果添加到新数组的工作确实有效,但它是一种常见的模式,许多语言都有更容易解决。在Ruby中,它被称为'map' aliased as 'collect'。演示:

class Cell

attr_accessor :value

  def initialize(value)
    @value = value
  end

end

class Grid

attr_accessor :test_array, :cells

  def initialize
    @test_array = [1,2,3,4]
    @cells = @test_array.map{|a_value| Cell.new(a_value)}
   end

  def put_values_of_objects_to_array
    @cells.map{|cell| cell.value}
  end

end


f = Grid.new
p f.put_values_of_objects_to_array #=> [1, 2, 3, 4]