irb(main):001:0> :+.class
=> Symbol
Это просто символ, содержащий имя метода.
irb(main):004:0> 1.method(:+)
=> #<Method: Integer#+(_)>
irb(main):005:0> 1.method(:+).call(1)
=> 2
Enumerable # reduce и Enumerable # inject принимает символ, строку или pro c и вызывает этот метод для каждая итерация l oop.
[1,2,3].reduce(:+)
[1,2,3].reduce('+')
[1,2,3].reduce(&:+)
Все три из них возвращают 6. И они являются сокращением от:
[1,2,3].reduce { |sum, n| sum + n }
Причина, по которой символы чаще всего используются, заключается в том, что они интернированы и поэтому используют меньше памяти, чем не замороженные строковые атрибуты, и их также легче вводить.
И, наконец, с Ruby 2.4 вы можете просто использовать Enumerable # sum вместо:
[1,2,3].sum