【问题标题】:Loop with two elements of an array at a time一次循环使用数组的两个元素
【发布时间】:2015-06-24 12:40:29
【问题描述】:

给定这个数组:

NUMERIC_FIELDS = [:a_single, :a_aggregate,
                  :field_single, :field_aggregate,
                  :line_manager_single, :line_manager_aggregate,
                  :off_single, :off_aggregate,
                  :regional_single, :regional_aggregate]

如何循环遍历它并一次将它的两个元素传递给一个方法?我应该先通过a_singlea_aggregate,然后通过field_singlefield_aggregate。该方法只需要循环五次,因为有五对项目。

NUMERIC_FIELDS.each do |column_name|
  are_numeric_fields_valid(column_name)
end

【问题讨论】:

  • 您的代码中没有哈希。你在说什么哈希?
  • 对不起,我是 ruby​​ 新手,我已经修改了
  • 现在您的问题与ruby array loop always pair 和许多其他问题重复。

标签: arrays ruby


【解决方案1】:

首先,这不是哈希,而是符号数组。

要获得你需要的东西,你应该使用Enumerable#each_slice 方法

NUMERIC_FIELDS.each_slice(2) do |pair|
  are_numeric_fields_valid(pair[0], pair[1])
end

【讨论】:

  • 所以这会一次传入两个,我如何在其他方法中访问它们?
  • 而不是通过pair[0]pair[1] 引用它们,为什么不将它们作为单独的变量传递给块,例如NUMERIC_FIELDS.each_slice(2){ |column1,column2| are_numeric_fields_valid(column1,column2) } 我认为它增加了可读性。
  • 是的,这也有效。我还喜欢使用 splat (*) 运算符将它传递给方法。
【解决方案2】:

使用Enumerate#each_slice:

NUMERIC_FIELDS.each_slice(2) do |column_name|
  are_numeric_fields_valid(*column_name)
end

splat 运算符* 是传递两个参数而不是单个Array,即are_numeric_fields_valid(:a_single, :a_aggregate) 而不是are_numeric_fields_valid([:a_single, :a_aggregate])

【讨论】:

  • 如果您不打算在块中拆分变量(正如我在@nesiseka 回答的评论中提到的那样),这个答案可能是最好的方法,但我仍然认为拆分变量会增加可读性跨度>
【解决方案3】:
NUMERIC_FIELDS.each_slice(2) do |column_name|
 # and you can grab each symbol like: column_name[0] and column_name[1]
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 2013-06-22
    • 2020-04-04
    • 2023-03-29
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    相关资源
    最近更新 更多