有没有更好的方法来查找集合的当前元素是否是最后一个元素?
@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
答案 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
除此之外,这两种方法都很好。