Ruby Array Chainables, сочетающие карту и внедрение - PullRequest
1 голос
/ 02 мая 2020

Есть ли хороший способ создать цепочку Ruby на лету, которая объединяет карту и инъекцию?

Вот что я имею в виду. Пусть a будет массивом целых чисел, тогда мы можем получить все суммы 2 смежных элементов:

a.each_cons(2).map(&:sum)

Мы также можем получить произведение всех элементов массива a на:

a.inject(1,&:*)

Но мы не можем сделать:

a.each_cons(2).map(&:inject(1,&:*))

Однако мы можем определить цепочку массивов:

class Array

  def prod
    return self.inject(1,&:*)
  end

end

Тогда a.each_cons(2).map(&:prod) работает нормально .

Ответы [ 2 ]

3 голосов
/ 02 мая 2020

Если вы используете этот патч странного символа, показанный здесь:

{ ссылка }

class Symbol
  def call(*args, &block)
    ->(caller, *rest) { caller.send(self, *rest, *args, &block) }
  end
end

Это позволяет передавать аргументы в стенограмму pro c с помощью Curry :

[[1,2],[3,4]].map(&:inject.(1, &:*))
# => [2, 12]

Я уверен, что это много раз запрашивалось в Ruby ядре, к сожалению, у меня нет ссылки на форумы Ruby прямо сейчас, но я обещаю вам, что это там.

1 голос
/ 02 мая 2020

Я сомневаюсь, что это то, что вы ищете, но не забывайте, что вы все равно можете позвонить map с обычным блоком.

a.each_cons(2).map { |n1, n2| n1 * n2 }

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

...