红宝石中的正到负范围

时间:2017-09-04 07:35:57

标签: arrays ruby range

我发现了一个读取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

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

3 个答案:

答案 0 :(得分:4)

  

从正面向负方向前进的范围是什么?

我假设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"]

答案 1 :(得分:2)

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

  

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

Integer#succ方法:

  

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

因此,您无法在数字中添加一个并以较少的数字结尾。 self.rows[start_row..-1]有效的原因是,Range虽然end实际上没有实际遍历范围,但Array#[]的负数却是beginning index范围的1}}实际上并不被视为负数,而是负数索引,它告诉数组从数组的末尾向后计数。

length实际上最终会将范围转换为lengthbeg,并从12开始返回-1个元素。

作为旁注,打印来自12.downto(-1) { |x| puts x } - >的所有数字。 Array#[],你可以做到

begin

但这并不是end方法的作用,它将范围视为-1AS BEGIN IF(@statement = 1) BEGIN INSERT INTO [employee].[dbo].[emp_detail] ([fname], [lname], [age],[gender], [department], [salary]) VALUES (@fname, @lname, @age, @gender, @department, @salary) END IF(@statement = 2) BEGIN SELECT * FROM emp_detail END ,并将任何负数转换为向后计数数组的结尾,List<Nullable<int>> tbl = context.USP_MVC(2,fname, lname,Convert.ToInt32(age), gender, department, salary).ToList(); 是最后一个元素。

答案 2 :(得分:2)

  

如何在控制台中打印此范围?

如果您想使用range中使用否定顺序:

> (-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]