Как работает эта магия? - PullRequest
       1

Как работает эта магия?

5 голосов
/ 11 августа 2010

Сегодня я видел фрагмент кода рубина.

[1,2,3,4,5,6,7].inject(:+)  

=> 28

[1,2,3,4,5,6,7].inject(:*)  

=> 5040

Инъекция здесь сильно отличается от тех, что я видел раньше, например

[1,2,3,4,5,6,7].inject {|sum, x| sum + x}

Пожалуйста, объясните, как это работает?

Ответы [ 3 ]

6 голосов
/ 11 августа 2010

Нет магии, символ (метод) - это только один из возможных параметров. Это из документов:

  # enum.inject(initial, sym) => obj
  # enum.inject(sym)          => obj
  # enum.inject(initial) {| memo, obj | block }  => obj
  # enum.inject          {| memo, obj | block }  => obj

Наш случай - второй.

Вы также можете переписать его традиционным блоком:

op = :+   #  parameter of inject call
[1,2,3,4,5,6,7].inject {|sum, x| sum.send(op, x)} #  also returns 28

(ответить на часть "как это работает")

3 голосов
/ 11 августа 2010

: + - это символ , представляющий дополнительное сообщение.Помните, что в Ruby есть стиль Smalltalk, при котором практически каждая операция выполняется путем отправки сообщения объекту.

Как подробно обсуждено здесь , (1..100).inject(&:+) - допустимый синтаксис в более ранних версияхгде Rails добавил расширение to_proc в Symbol.

Возможность передавать только символ в инъекцию была новой в 1.9 и перенесена в 1.8.7 .

1 голос
/ 11 августа 2010

Как вы можете видеть в документах , inject может принимать блок (как вы уже знакомы) или символ, представляющий имя двоичного оператора. Это полезное сокращение для уже определенных операций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...