【问题标题】:Getting a "NoSuchMethodError" when trying to create an array of arrays尝试创建数组数组时出现“NoSuchMethodError”
【发布时间】:2017-01-10 06:16:44
【问题描述】:

我使用的是 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

但我在“data_cols[index][data_cols[index] ? data_cols[index].size : 0] = part”行收到“NoMethodError: undefined method `[]=' for nil:NilClass”错误。我想要做的是对于每个部件数组,将“部件”中的每个项目推到它自己的数组上,对应于部件中该元素的索引。因此,例如,如果循环的第一次迭代的部分等于

[1, 5, 8, 12]

我会有一个看起来像的 data_cols 数组

[[1], [5], [8], [12]]

如果循环的下一次迭代有一个看起来像这样的部件数组

[19, 20, 21, 22]

data_cols 数组随后将更改为

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

【问题讨论】:

    标签: arrays ruby nosuchmethoderror


    【解决方案1】:

    如果不知道 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]]
    

    【讨论】:

    • 谢谢,但有一个问题。如果 data_cols 是“[[1, 19], [5, 20], [8, 21], [12, 22]]”,并且我有一个数组 taht 是 [99, 88, 77, 66],则执行 [ data_cols, arr].transpose 产生“[[[1, 19], 99], [[5, 20], 88], [[8, 21], 77], [[12, 22], 66]]" , 但我希望它产生“[[1, 19, 99], [5, 20, 88], [8, 21, 77], [12, 22, 66]]”。这有意义吗?感谢您对我众多问题的所有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多