【问题标题】:Positive to Negative range in ruby红宝石的正负范围
【发布时间】:2018-02-12 09:55:37
【问题描述】:

我发现了一个读取一行excel表格的函数:

self.rows[start_row..-1]

其中start_row12

我想知道print [12..-1] 的输出。我试过这些代码:

[12..-1].each{|n| puts n}
(12..-1).each {|n| puts n}

但没有找到运气。我明白了

[12..-1]
# [12..-1] 
[12..-1].each {|x| puts x}
# >> 12..-1
# => [12..-1] 
(12..-1).each {|x| puts x}
# => 12..-1

从正向负向的范围是多少?如何在控制台中打印这样的范围?

【问题讨论】:

  • @Ilya ,对不起,但这没有回答我的问题,我指定的代码目前正在运行。您提供的链接谈到了从正到正的下降趋势。但我的问题是从正面到负面。
  • 从 12 向上到 -1 的范围为空。没有什么可以迭代的。这在 Ilya 所链接问题的三个不同答案中得到了解释。

标签: arrays ruby range


【解决方案1】:

从正向负向的范围是多少?

我假设rows 是一个数组。在这种情况下,-1 表示 最后一个元素-2 表示倒数第二个,-3 表示倒数第二个,依此类推:

array = ['a', 'b', 'c', 'd', 'e', 'f']

array[2..-1] #=> ["c", "d", "e", "f"]
array[2..-2] #=> ["c", "d", "e"]
array[2..-3] #=> ["c", "d"]

Array#[](以及其他)允许您指定从开始计数的正索引和从结束计数的负索引:

# 0    1    2    3    4    5
#-6   -5   -4   -3   -2   -1
['a', 'b', 'c', 'd', 'e', 'f']

在实现方面,您可以将array[-5] 视为array[array.length-5]

所以1-5 参考"b"

array[1]  #=> "b"
array[-5] #=> "b"

就像4-2 参考"e"

array[4]  #=> "e"
array[-2] #=> "e"

此外,所有这些范围都返回相同的子数组(对于长度为 6 的数组):

array[1..4]   #=> ["b", "c", "d", "e"]
array[1..-2]  #=> ["b", "c", "d", "e"]
array[-5..4]  #=> ["b", "c", "d", "e"]
array[-5..-2] #=> ["b", "c", "d", "e"]

你的例子:

rows[start_row..-1]

相当于:

rows[start_row..rows.length-1]

回答你的其他问题

如何在控制台中打印这样的范围?

你可以使用downto:

12.downto(-1) { |i| puts i }

输出:

12
11
10
9
8
7
6
5
4
3
2
1
0
-1

但是,请注意,这些索引与rows[12..-1] 返回的索引不同:

array = ['a', 'b', 'c', 'd', 'e', 'f']

array[3..-1]
#=> ["d", "e", "f"]

array.values_at(3, 2, 1, 0, -1)
#=> ["d", "c", "b", "a", "f"]

【讨论】:

    【解决方案2】:

    Ranges 不会向下工作(正面 -> 较小正面、正面 -> 负面或负面 -> 较小负面),因为:

    将范围视为序列的方法(#each 和从 Enumerable 继承的方法)期望 begin 对象实现 succ 方法以返回序列中的下一个对象。

    Integer#succ 方法:

    返回 int 的后继,即等于 int+1 的 Integer。

    因此,您不能将一个数字添加到一个较小的数字上。 self.rows[start_row..-1] 起作用的原因是,虽然它是 Range,但 Array#[] 实际上并没有遍历该范围,并且该范围的 end 处的负数并没有真正被视为负数,而是一个负索引,它告诉数组从数组末尾倒数。

    Array#[] 实际上最终将 Range 转换为 beginning indexlength 并返回 lengthbeg 开始的元素数量。


    作为旁注,要打印来自12 -> -1 的所有数字,您可以这样做

    12.downto(-1) { |x| puts x }
    

    但这不是Array#[] 方法正在做的事情,它将范围视为beginend,并将任何负数转换为从数组末尾向后计数,@987654340 @ 是最后一个元素。

    【讨论】:

      【解决方案3】:

      如何在控制台中打印这样的范围?

      如果你想使用range 并且按照positivenegative的顺序:

      > (-1..12).to_a.reverse
      #=> [12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1]
      

      range否定肯定的顺序:

      > (-1..12).to_a
      #=> [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
      

      【讨论】:

        猜你喜欢
        • 2017-04-01
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        • 2016-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多