用于访问数组中第一个/最后一个元素的Ruby约定

Dan*_*ahn 12 ruby coding-style

这是一个关于惯例的问题.以下两组命令返回相同的结果.

a = [1, 2, 3]

a.first  # => 1
a[0]     # => 1

a.last   # => 3
a[-1]    # => 3
Run Code Online (Sandbox Code Playgroud)

在Ruby,显式索引或函数中哪些是首选的?当然,假设这是在代码中始终访问第一个或最后一个元素.

注意:我一直在考虑每个人都会采取的周期.因为firstlast接受参数,他们会有更多的开销,但我不知道这是否会影响社区的偏好.

谢谢!


编辑

如果你阅读这篇文章的评论,我的最后一段就有一个很大的争论.虽然我没记住这[x]相当于.[](x),但我的结论是正确的,即第一个和最后一个有更多的开销.考虑到两者的性质,我认为这是由于first/ 的参数检查last.这些需要检查是否存在参数,而[]可以假设它们存在.

require 'benchmark'

a = [1..1000]

MAX = 1000000

Benchmark.bm(15) do |b|
  b.report("small first") { MAX.times do; a.first; end }
  b.report("small [0]")   { MAX.times do; a[0];    end }
  b.report("small last")  { MAX.times do; a.last;  end }
  b.report("small [-1]")  { MAX.times do; a[-1];   end }
end

a = [1..100000000000]

Benchmark.bm(15) do |b|
  b.report("large first") { MAX.times do; a.first; end }
  b.report("large [0]")   { MAX.times do; a[0];    end }
  b.report("large last")  { MAX.times do; a.last;  end }
  b.report("large [-1]")  { MAX.times do; a[-1];   end }
end
Run Code Online (Sandbox Code Playgroud)

结果

                      user     system      total        real
small first       0.350000   0.000000   0.350000 (  0.901497)
small [0]         0.330000   0.010000   0.340000 (  0.857786)
small last        0.370000   0.000000   0.370000 (  1.054216)
small [-1]        0.370000   0.000000   0.370000 (  1.137655)
                      user     system      total        real
large first       0.340000   0.010000   0.350000 (  0.897581)
large [0]         0.320000   0.010000   0.330000 (  0.889725)
large last        0.350000   0.000000   0.350000 (  1.071135)
large [-1]        0.380000   0.000000   0.380000 (  1.119587)
Run Code Online (Sandbox Code Playgroud)

Lin*_*ios 10

代码读取超过它被写入,并firstlast少取精力去了解,特别是对于缺乏经验的程序员的Ruby或某人从不同的索引语义的语言.

虽然大多数程序员会立即知道这些是相同的:

a.first
a[0]
Run Code Online (Sandbox Code Playgroud)

第一个仍然更容易阅读.阅读的难度并没有显着差异,但它就在那里.

last是另一个问题.访问索引0将以几乎任何语言为您提供数组的第一个元素.但负面索引仅适用于某些语言.如果一个具有最小Ruby经验的C程序员试图读取我的代码,那么他们会更快地理解吗?:

a.last
a[-1]
Run Code Online (Sandbox Code Playgroud)

负面指数可能会迫使他们进行谷歌搜索.