得到一个" NoSuchMethodError"在尝试创建数组数组时

时间:2017-01-09 21:41:04

标签: arrays ruby nosuchmethoderror

我使用的是Ruby 2.4。我在创建数组数组时遇到了麻烦。我有这个

  data_cols = [[], []]
  lines.each do |line|
    parts = [0, *shared_space_indexes, line.size].each_cons(2).map { |a, b| line[a...b].strip }
    parts.each_with_index do |part, index|
      data_cols[index][data_cols[index] ? data_cols[index].size : 0] = part
    end
  end

但是我得到了一个" NoMethodError:未定义的方法`[] ='为零:NilClass" " data_cols [index] [data_cols [index]? data_cols [index] .size:0] = part"线。我想要做的是为每个零件阵列,推动每个项目在"部分"在它自己的数组上对应于部分中该元素的索引。因此,例如,如果循环的第一次迭代具有等于

的部分
[1, 5, 8, 12]

我会有一个看起来像

的data_cols数组
[[1], [5], [8], [12]]

如果循环的下一次迭代有一个看起来像

的零件数组
[19, 20, 21, 22]

然后将data_cols数组更改为

[[1, 19], [5, 20], [8, 21], [12, 22]]

1 个答案:

答案 0 :(得分:0)

很难在不知道linesshared_space_indexes的情况下进行测试。

2列→矩阵

拉链

对于问题的第二部分,您可以使用:

[1, 5, 8, 12].zip([19, 20, 21, 22])
#=> [[1, 19], [5, 20], [8, 21], [12, 22]]

[[1, 5, 8, 12],[19, 20, 21, 22]].transpose
#=> [[1, 19], [5, 20], [8, 21], [12, 22]]

使用transpose,两个数组都需要具有相同的大小。

3列→矩阵

array1 = [1, 5, 8, 12]
array2 = [19, 20, 21, 22]
array3 = [99, 88, 77, 66]

p [array1, array2, array3].transpose
#=> [[1, 19, 99], [5, 20, 88], [8, 21, 77], [12, 22, 66]]

列→行

如果你有一个数组数组:

arrays = [
  [1, 5, 8, 12],
  [19, 20, 21, 22],
  [99, 88, 77, 66]
] 

p arrays.transpose
#=> [[1, 19, 99], [5, 20, 88], [8, 21, 77], [12, 22, 66]]

所以在你的情况下,我只是专注于创建一个长度相同的数组,并在最后使用transpose

矩阵+列→矩阵

如你所知,如果你有

data_cols = [[1, 19], [5, 20], [8, 21], [12, 22]]
arr       = [99, 88, 77, 66]

data_cols.zip(arr)会产生一个奇怪的半嵌套数组:

[[[1, 19], 99], [[5, 20], 88], [[8, 21], 77], [[12, 22], 66]]

您可以使用:

p data_cols.zip(arr).map(&:flatten)
#=> [[1, 19, 99], [5, 20, 88], [8, 21, 77], [12, 22, 66]]