Небольшой пост на тему необходимости использовать плюшек языка(ов) на примере использования унарного амперсанда в Ruby.
Не будем брызгать слюной, сразу перейдем к примерам:
# a) перебираем элементы массива (1..10)
# b) применение лямбда функции ко всем элементам этого массива при помощи &
# Подопытная лямбда
test_lam=lambda{|inPut|
puts("#{inPut}: #{inPut**2}");
inPut**2 # В качестве возвращаемого значения
}
# синтаксис с &
buf=(1..10).to_a.map &test_lam
# классический эквивалент
buf2=(1..10).to_a.map{|input| test_lam.call(input)}
Результат, предсказуем:
1: 1
2: 4
3: 9
4: 16
5: 25
6: 36
7: 49
8: 64
9: 81
10: 100
# Еще один пример
buf2=[1, 2, 3].map(&:to_s)
p buf2 # => ["1", "2", "3"]
# Эквивалент:
p [1, 2, 3].map { |i| i.to_s }
Что лучше? В сети нашел наводящий на мысли бенчмарк на эту тему
# Небольшой Бенчмарк: (http://blog.hasmanythrough.com/2006/3/7/symbol-to-proc-shorthand,
# http://m.onkey.org/let-s-start-with-wtf )
# traditional calls (with a block as in obj.each {|e| e.method_name })
# И Унарный амперсаендd to a Proc (like obj.each(&:method_name)).
require 'benchmark'
require 'rubygems'
require 'active_support'
array = [ 1, 'ab', :dog, 3.8 ]
COUNT = 100_000
Benchmark.bmbm(2) do |test|
test.report('Using Symbol#to_proc') do
COUNT.times do
array.map(&:to_s)
end
end
test.report('Standard call') do
COUNT.times do
array.map {|e| e.to_s }
end
end
end
Полученный результат
=begin
Rehearsal --------------------------------------------------------
Using Symbol#to_proc 1.125000 0.000000 1.125000 ( 1.125000)
Standard call 0.578000 0.000000 0.578000 ( 0.578000)
----------------------------------------------------- total: 1.703000sec
user system total real
Using Symbol#to_proc 1.015000 0.000000 1.015000 ( 1.015000)
Standard call 0.563000 0.000000 0.563000 ( 0.563000)
=end
Может быть показания спидометра и не являются доказательством правильности курса, но примеры с использованием амперсанда проигрывают по времени исполнения «классическому» стилю.
Комментариев нет:
Отправить комментарий