如何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