【问题标题】:each_with_index_do starting at 1 for indexeach_with_index_do 从 1 开始索引
【发布时间】:2013-01-01 11:51:52
【问题描述】:

我在 Rails 应用程序的视图上使用 ruby​​ 迭代器,如下所示:

<% (1..@document.data.length).each_with_index do |element, index| %>
  ...
<% end %>

我认为添加 1.. 而不是仅仅说: @document.data

会得到让上面的索引从 1 开始的技巧。但是很可惜,上面的代码索引仍然是 0 到 data.length(实际上是 -1)。那么我做错了什么,我需要索引等于 1-data.length...不知道如何设置迭代器来执行此操作。

【问题讨论】:

  • 数组的第一个索引总是0
  • 索引将始终从零开始。为什么重要?
  • @Codejoy - 赞成/接受一些答案是明智的,因为您的问题已被多个用户回答。

标签: ruby ruby-on-rails-3 iterator


【解决方案1】:

这可能与所讨论的each_with_index 方法不完全相同,但我认为结果可能接近于 mod 中的某些问题...

%w(a b c).each.with_index(1) { |item, index| puts "#{index} - #{item}" }

# 1 - a
# 2 - b
# 3 - c

更多信息https://ruby-doc.org/core-2.6.1/Enumerator.html#method-i-with_index

【讨论】:

    【解决方案2】:

    使用Integer#next:

    [:a, :b, :c].each_with_index do |value, index|
      puts "value: #{value} has index: #{index.next}"
    end
    

    产生:

    value: a has index: 1
    value: b has index: 2
    value: c has index: 3
    

    【讨论】:

      【解决方案3】:

      我有同样的问题,并通过使用 each_with_index 方法解决了它。但是代码中的索引加了1。

      @someobject.each_with_index do |e, index|
         = index+1
      

      【讨论】:

        【解决方案4】:

        除非您使用像 1.8 这样的旧 Ruby(我认为这是在 1.9 中添加的,但我不确定),否则您可以使用 each.with_index(1) 来获取基于 1 的枚举器:

        你的情况是这样的:

        <% @document.data.length.each.with_index(1) do |element, index| %>
          ...
        <% end %>
        

        希望有帮助!

        【讨论】:

        • 这些天肯定是更好的答案。
        • 我希望这个问题的作者将其设置为正确答案。对于那些没有进一步阅读并错过这一点的人,我感到难过。模组可以更改接受的答案>
        • 在 Ruby 2.6.4 中工作,虽然我错过了 each*.*with 并且一开始使用的是下划线。
        【解决方案5】:

        如果我理解你的问题,你想从 1 开始索引,但在 ruby​​ 数组中,基本索引为 0,所以最简单的方法是

        给定@document.data 是一个数组

        index = 1
        @document.data.each do |element| 
            #your code
            index += 1
        end
        

        HTH

        【讨论】:

          【解决方案6】:

          我想你可能误解了each_with_index

          each 将遍历数组中的元素

          [:a, :b, :c].each do |object|
            puts object
          end
          

          哪个输出;

          :a
          :b
          :c
          

          each_with_index 遍历元素,同时传入索引(从零开始)

          [:a, :b, :c].each_with_index do |object, index|
            puts "#{object} at index #{index}"
          end
          

          哪个输出

          :a at index 0
          :b at index 1
          :c at index 2
          

          如果你希望它是 1-indexed,那么只需添加 1。

          [:a, :b, :c].each_with_index do |object, index|
            indexplusone = index + 1
            puts "#{object} at index #{indexplusone}"
          end
          

          哪个输出

          :a at index 1
          :b at index 2
          :c at index 3
          

          如果你想遍历数组的子集,那么只需选择子集,然后遍历它

          without_first_element = array[1..-1]
          
          without_first_element.each do |object|
            ...
          end
          

          【讨论】:

            【解决方案7】:

            数组索引总是从零开始。

            如果你想跳过第一个元素,听起来就像你做的那样:

            @document.data[1..-1].each do |data|
               ...
            end
            

            【讨论】:

              【解决方案8】:

              没有让索引从 1 开始的事情。如果您想跳过数组中的第一项,请使用 next

              <% (1..@document.data.length).each_with_index do |element, index| %>
                next if index == 0
              <% end %>
              

              【讨论】:

              • 琐事:Perl 有一个全局变量$[,您可以设置使所有数组索引从 1 或任何其他值开始。我们应该很高兴 Ruby 没有这个。
              猜你喜欢
              • 2016-12-27
              • 2019-12-20
              • 1970-01-01
              • 1970-01-01
              • 2015-05-02
              • 1970-01-01
              • 2015-10-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多