确定当前元素是集合的最后一个元素?

时间:2011-04-01 04:06:20

标签: ruby-on-rails-3

有没有更好的方法来查找集合的当前元素是否是最后一个元素?

@oranges = Orange.all

@oranges.each_with_index do |o, current_index|
  puts @oranges.size == (current_index + 1) ? "Last element!" : "Get next element"
end

OR

@oranges.each do |o|
  puts @oranges.last == o ? "Last element!" : "Get next element"
end

2 个答案:

答案 0 :(得分:3)

要么看起来不错,但是如果你认真考虑了性能,我会跑一些基准:

require 'benchmark'
a = (1..1000).to_a

def first(a)
  a.each_with_index do |o,i|
    a.size == (i + 1)
  end
end

def first_cached(a)
  a_size = a.size
  a.each_with_index do |o,i|
    a_size == (i + 1)
  end
end

def second(a)
  a.each do |e|
    a.last == e
  end
end

def second_cached(a)
  a_last = a.last
  a.each do |e|
    a_last == e
  end
end

Benchmark.bm(7) do |x|
x.report("first") {10000.times {first(a)}}
x.report("first_cached") {10000.times{first_cached(a)}}
x.report("second") {10000.times{second(a)}}
x.report("second_cached") {10000.times{second_cached(a)}}
end

返回:

             user     system      total        real
first    2.020000   0.010000   2.030000 (  2.024102)
first_cached  1.930000   0.000000   1.930000 (  1.947230)
second   1.920000   0.010000   1.930000 (  1.922338)
second_cached  1.350000   0.000000   1.350000 (  1.352786)

所以第二个版本的缓存大小产生了更好的结果......但是如果这些微观性能无关紧要,那应该不是问题。

答案 1 :(得分:1)

第一个解决方案是否有效? o是橙色,没有size方法。

您可以改为:

@oranges.each_with_index do |o, current_index|
  puts current_index == @oranges.size - 1 ? "Last element!" : "Get next element"
end

除此之外,这两种方法都很好。