Что вызывается (: +) и какова его функция в этой строке кода? - PullRequest
1 голос
/ 09 мая 2020

totals = party.transpose.map {| r | r.reduce (: +)}

Здесь я уменьшаю 2D-массив в 1D-массив, и мне просто хотелось бы узнать больше о (: +). Я использовал его несколько раз в своем коде, но я не полностью его понимаю, т.е. как он называется, когда и почему он используется

1 Ответ

3 голосов
/ 09 мая 2020
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
...