如何处理整数数组@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
答案 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]