Рубиновый эквивалент метода C # Linq Aggregate - PullRequest
5 голосов
/ 18 февраля 2011

Что такое рубиновый эквивалент метода Linq Aggregate. Это работает примерно так

  var factorial = new[] { 1, 2, 3, 4, 5 }.Aggregate((acc, i) => acc * i);

переменная acc накапливается каждый раз, когда значение из последовательности массивов передается в лямбду.

Ответы [ 2 ]

14 голосов
/ 18 февраля 2011

Это обычно называется fold в математике, а также почти во всех языках программирования.Это пример более общей концепции катаморфизма .Ruby наследует свое имя для этой функции от Smalltalk, где она называется inject:into: (используется как aCollection inject: aStartValue into: aBlock.). Так, в Ruby она называется inject.Он также имеет псевдоним reduce, что несколько неудачно, поскольку это обычно означает что-то немного другое.

Ваш пример C # будет выглядеть примерно так в Ruby:из них, вероятно, будет более идиоматическим:

factorial = (1..5).reduce(:*)
factorial = 1.upto(5).reduce(:*)
2 голосов
/ 18 февраля 2011

См. Enumerable # inject .

Использование:

a = [1,2,3,4,5]
factorial = a.inject(1) do |product, i|
  product * i
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...