如何Enumerable#any?
>> cheeses = %w(chedder stilton brie mozzarella feta haloumi)
=> ["chedder", "stilton", "brie", "mozzarella", "feta", "haloumi"]
>> foods = %w(pizza feta foods bread biscuits yoghurt bacon)
=> ["pizza", "feta", "foods", "bread", "biscuits", "yoghurt", "bacon"]
>> foods.any? {|food| cheeses.include?(food) }
=> true
基准脚本:
require "benchmark"
N = 1_000_000
puts "ruby version: #{RUBY_VERSION}"
CHEESES = %w(chedder stilton brie mozzarella feta haloumi).freeze
FOODS = %w(pizza feta foods bread biscuits yoghurt bacon).freeze
Benchmark.bm(15) do |b|
b.report("&, empty?") { N.times { (FOODS & CHEESES).empty? } }
b.report("any?, include?") { N.times { FOODS.any? {|food| CHEESES.include?(food) } } }
end
结果:
ruby version: 2.1.9
user system total real
&, empty? 1.170000 0.000000 1.170000 ( 1.172507)
any?, include? 0.660000 0.000000 0.660000 ( 0.666015)
Ruby通过构建一个散列来完成交集,所以它绝对不会与'any?{... include?}'不一样,它将遍历每一个潜在的元素对。交点'&'因此是线性时间,而'any?'将是二次的。如果“奶酪”是一个“集合”而不是“阵列”,这将是等价的。 – 2010-10-15 15:21:00
当检查一个数组是否包含另一个数组中的元素时,做它(奶酪和食物)是否更有意义?因为如果数组实际上包含任何相同的元素,它会返回一个真值。 – 2014-07-15 21:46:31
@RyanFrancis,docs:'any?':*如果块返回的值不是false或nil,则该方法返回true *:* empty *:如果self不包含任何元素,则返回true * – Nakilon 2014-07-15 22:40:12